关于tkinter循环的问题和可能的解决方案

时间:2019-08-24 02:22:33

标签: python tkinter

基本上,我试图与音频监听无限循环一起创建tkinter UI。我的问题是,after()方法不能真正用作具有退出条件的传统无限循环。

我想同时保留tkinter的主循环和我自己的主循环,所以我的无限循环将一直监听直到满足退出条件,然后我才中断循环。

我当时在研究多线程,但由于不太了解tkinter,因此我不太确定如何使用tkinter来完成此操作

最终我想这样做

fun.data

2 个答案:

答案 0 :(得分:0)

您可以在此结构中使用退出条件:

def listen(event='dummy_event'):
    if exit_condition:
        return
    do_the_listening_thinghy()
    root.after(100, listen)


exit_condition = False

root = Tk()
deploy_btn = Button(root, text="Listen", command=listen)    
deploy_btn.pack()

root.mainloop()

答案 1 :(得分:0)

有两种选择。

创建您自己的事件循环

编写自己的循环来执行所需的任何音频捕获,而不是调用root.mainloop(),然后调用root.update()处理Tkinter事件。

这可能需要仔细调整。您既不想丢失任何音频,也不想让GUI变得无响应。

与此类似的替代方法:

asyncio集成到您的tkinter程序中

如果您熟悉asyncio样式,这可能会做得很好。它还支持该语言。

不幸的是,asyncio仍在进行中。因此,您发现的示例可能已过时,甚至无法使用。

对音频使用单独的过程

启动multiprocessing.Process进行音频捕获。使用multiprocessing.Pipe向过程发送命令并接收音频数据(使用after)。 您可能应该在创建根窗口之前 创建此过程。

此方法的最大优点是:

  • 它不会干扰GUI进程,
  • 它可以与GUI分开进行测试,
  • 任何音频处理都可以在第二过程(甚至是第三过程)中完成,而不会干扰GUI。

为音频使用单独的线程

由于音频涉及I / O,因此可能非常适合线程化。

如果您还需要进行CPU密集型音频数据处理,则不会这样做。在CPython中,一次只能有一个线程在执行Python字节码。因此,当第二个线程开始计算时,您的GUI线程可能会饿死于运行时间。