我想创建一个简单的gui,其中有一个play和stop按钮,可以在python中播放mp3文件。我使用Tkinter创建了一个非常简单的图形用户界面,它由两个按钮(停止和播放)组成。
我创建了一个函数,它执行以下操作:
def playsound () :
sound = pyglet.media.load('music.mp3')
sound.play()
pyglet.app.run()
我把这个功能作为一个命令添加到按钮播放中。我还做了一个不同的功能来停止音乐:
def stopsound ():
pyglet.app.exit
我将此函数作为命令添加到第二个按钮。但问题是,当我点击play时,python和gui会冻结。我可以试着关上窗户,但它不关,而且停止按钮没有反应。我知道这是因为pyglet.app.run()一直在执行,直到歌曲结束,但是我到底该如何防止?我想让gui在我点击按钮时停止音乐。我能在哪里找到解决办法吗?
我会这样做:
这个解决方案最简单:
来源:http://ubuntuforums.org/showthread.php?t=1651906
您将两个UI库混合在一起-这在本质上并不坏,但存在一些问题。值得注意的是,它们都需要一个自己的主循环来处理它们的事件。TKinter使用它来与桌面和用户生成的事件通信,在本例中,pyglet使用它来播放您的音乐。
这些循环中的每一个都阻止了正常的“自上而下”程序流,就像我们在学习非GUI编程时习惯的那样,程序应该基本上从主循环进行回调。在本例中,在Tkinter回调的中间,您将pyglet主循环(调用
pyglet.app.run
)置于运动状态,并且控件永远不会返回Tkinter库。有时不同库的循环可以在同一个进程上共存,没有冲突——但当然,您要么运行其中一个,要么运行另一个。如果是这样,则可以在不同的Python线程中运行每个库的主循环。
如果它们不能同时存在,则必须在不同的过程中处理每个库。
因此,让音乐播放器在另一个线程中启动的一种方法可能是:
如果Tkinter和pyglet可以共存,那就足够让你的音乐开始了。 然而,为了能够控制它,您需要实现更多的事情。我的建议是对pyglet线程进行一次回调,pyglet每秒调用一次——这个回调检查一些全局变量的状态,并根据它们选择停止音乐、更改正在播放的文件等。
相关问题 更多 >
编程相关推荐