基本上,我试图与音频监听无限循环一起创建tkinter UI。我的问题是,after()方法不能真正用作具有退出条件的传统无限循环。
我想同时保留tkinter的主循环和我自己的主循环,所以我的无限循环将一直监听直到满足退出条件,然后我才中断循环。
我当时在研究多线程,但由于不太了解tkinter,因此我不太确定如何使用tkinter来完成此操作
最终我想这样做
fun.data
答案 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
)。
您可能应该在创建根窗口之前 创建此过程。
此方法的最大优点是:
由于音频涉及I / O,因此可能非常适合线程化。
如果您还需要进行CPU密集型音频数据处理,则不会这样做。在CPython中,一次只能有一个线程在执行Python字节码。因此,当第二个线程开始计算时,您的GUI线程可能会饿死于运行时间。