Python 按钮释放器

Python 按钮释放器,python,tkinter,pygame,Python,Tkinter,Pygame,这是我的情况。我有两个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).p

这是我的情况。我有两个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()
    
    问题是,当我点击“播放”按钮时,它会一直按下,直到声音播放完毕,冻结整个程序,在此期间不允许我按下“停止”按钮

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

    此技巧非常有用

    而不是:

    Button(tkwin, text="Go", command=dosomething)
    
    改为:

    def delayedDoSomething():
           tkwin.after(100, dosomething)
    
    Button(tkwin, text="Go", command=delayedDoSomething)
    
    对于您的代码,您可以尝试编写一个
    customPlay
    方法,在第二个线程中运行您想要的Play。至少,你可以从这个重写技巧的方法中得到灵感

    也许你可以用

    尽管Tkinter在技术上是线程安全的(假设Tk是用 --启用线程),实际上在多线程Python应用程序中使用时仍然存在问题。这些问题源于 _tkinter模块试图控制主电源的事实 处理来自其他服务器的调用时,通过轮询技术执行线程 线程。如果成功了,一切都很好。如果失败(即,在 超时),应用程序收到异常,并显示以下消息: “RuntimeError:主线程不在主循环中”。没有办法 告知何时可能发生这种情况,因此从多个 线程充其量似乎是有问题的


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

    这对我不起作用:(.只是一个查询,这里tkwin指的是父帧-对吗?我也尝试了[there]提到的高级版本,但代码似乎引用了一个方法self.updateDisplay()没有定义。有什么想法吗?不是一行可以复制粘贴的代码。我只是在暗示一些可能的解决方法,定义你自己的播放方法。我没有复制确切的东西。我肯定会将这个概念应用到我的方法中。我甚至尝试将时间从100增加到1000或10000-不会收回按钮。延迟发生的事情按下按钮时使用ns无法解决问题。问题的根源在于tkinter是单线程的,因此在播放歌曲时GUI将没有响应。唯一的选择是在另一个线程或另一个进程中播放歌曲。线程对我来说太复杂了,我需要为此读很多书。同时,我插入了root.update()对我很有用。我读过你的评论,你说这很危险,但考虑到我目前的知识和关于线程的讨论听起来像希腊语,我想我会选择root.update()…感谢你的回复:)尝试按照你的建议实现线程。请您查看我的代码结构,网址为。。我很难组织代码。我们非常感谢您的建议