擅长:python、mysql、java
<p>您将两个UI库混合在一起-这在本质上并不坏,但存在一些问题。值得注意的是,它们都需要一个自己的主循环来处理它们的事件。TKinter使用它来与桌面和用户生成的事件通信,在本例中,pyglet使用它来播放您的音乐。</p>
<p>这些循环中的每一个都阻止了正常的“自上而下”程序流,就像我们在学习非GUI编程时习惯的那样,程序应该基本上从主循环进行回调。在本例中,在Tkinter回调的中间,您将pyglet主循环(调用<code>pyglet.app.run</code>)置于运动状态,并且控件永远不会返回Tkinter库。</p>
<p>有时不同库的循环可以在同一个进程上共存,没有冲突——但当然,您要么运行其中一个,要么运行另一个。如果是这样,则可以在不同的Python线程中运行每个库的主循环。</p>
<p>如果它们不能同时存在,则必须在不同的过程中处理每个库。</p>
<p>因此,让音乐播放器在另一个线程中启动的一种方法可能是:</p>
<pre><code>from threading import Thread
def real_playsound () :
sound = pyglet.media.load('music.mp3')
sound.play()
pyglet.app.run()
def playsound():
global player_thread
player_thread = Thread(target=real_playsound)
player_thread.start()
</code></pre>
<p>如果Tkinter和pyglet可以共存,那就足够让你的音乐开始了。
然而,为了能够控制它,您需要实现更多的事情。我的建议是对pyglet线程进行一次回调,pyglet每秒调用一次——这个回调检查一些全局变量的状态,并根据它们选择停止音乐、更改正在播放的文件等。</p>