按钮释放Tkinter

时间:2013-05-15 06:06:04

标签: python tkinter pygame

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

  1. 播放按钮:播放声音
  2. 停止按钮:在播放期间停止声音
  3. 代码如下:

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

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

    如何在游戏进行过程中阻止程序冻结,让我做其他事情,比如停止?

2 个答案:

答案 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将被冻结。