这是我的情况。我有两个tkinter按钮:
代码如下:
def Play(self):
//plays a file with pygame module
def Stop(self):
//Stop using pygame stop
Button( root, text ='Play', command= Play).pack()
Button( root, text ='Stop', command= Stop).pack()
问题在于,当我点击“播放”按钮时,它会一直按下直到它完成播放声音,冻结整个程序,不允许我在此期间按“停止”按钮。
如何在游戏进行过程中阻止程序冻结,让我做其他事情,比如停止?
答案 0 :(得分:1)
此提示为proposed here
而不是:
Button(tkwin, text="Go", command=dosomething)
改为:
def delayedDoSomething():
tkwin.after(100, dosomething)
Button(tkwin, text="Go", command=delayedDoSomething)
对于您的代码,您可以尝试编写一个customPlay
方法,该方法运行您希望在第二个线程中使用Play运行的内容。至少,你可以从这个方法重写技巧中获得灵感。
也许你可以使用mtTkinter, a thread safe version of Tkinter。
虽然Tkinter在技术上是线程安全的(假设Tk是用 --enable-threads),实际上在多线程Python应用程序中使用时仍然存在问题。问题源于此 事实上_tkinter模块试图获得对main的控制权 处理来自其他的调用时,通过轮询技术进行线程处理 线程。如果成功,一切都很顺利。如果失败(即,在...之后) 超时),应用程序收到带有消息的异常: “RuntimeError:主线程不在主循环中”。没有办法 告诉我什么时候会发生这种情况,所以从多个调用Tk例程 线程似乎充其量也存在问题。
答案 1 :(得分:1)
在播放歌曲时防止GUI冻结的唯一方法是使用单独的线程或单独的进程来播放歌曲。只要播放歌曲的功能正在运行并且在主线程中,事件循环就无法运行。如果事件循环无法运行,GUI将被冻结。