1

这是我的情况。我有两个 tkinter 按钮:

  1. 播放按钮:播放声音
  2. 停止按钮:在播放过程中停止声音

代码如下:

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()

问题是,当我单击“播放”按钮时,它会一直按下直到完成播放声音,冻结整个程序,在此期间不允许我按下“停止”按钮。

如何在播放过程中防止程序冻结以允许我执行其他操作,例如停止?

4

2 回答 2

1

这个提示是在这里提出的

代替:

Button(tkwin, text="Go", command=dosomething)

改为:

def delayedDoSomething():
       tkwin.after(100, dosomething)

Button(tkwin, text="Go", command=delayedDoSomething)

您可以尝试为您的代码编写一个customPlay方法,在第二个线程中运行您想使用 Play 运行的内容。至少,您可以从这个方法重写技巧中获得灵感。

也许您可以使用mtTkinter,这是 Tkinter 的线程安全版本

尽管 Tkinter 在技术上是线程安全的(假设 Tk 是使用 --enable-threads 构建的),但实际上在多线程 Python 应用程序中使用时仍然存在问题。问题源于 _tkinter 模块在处理来自其他线程的调用时试图通过轮询技术获得对主线程的控制。如果成功,一切都很好。如果失败(即超时后),应用程序会收到异常消息:“RuntimeError: main thread is not in main loop”。无法判断何时会发生这种情况,因此从多个线程调用 Tk 例程似乎充其量是有问题的。

于 2013-05-15T06:48:39.283 回答
1

在播放歌曲时防止 GUI 冻结的唯一方法是使用单独的线程或单独的进程来播放歌曲。只要播放歌曲的函数正在运行并且在主线程中,事件循环就无法运行。如果事件循环无法运行,GUI 将被冻结。

于 2013-05-15T11:19:17.343 回答