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



基本上我试图创建一个tkinter UI和一个音频收听无限循环。我的问题是 after() 方法并没有真正像具有退出条件的传统无限循环那样起作用。

我想同时保留 tkinter 的主循环和我自己的循环,所以我的无限循环会不断侦听,直到满足退出条件,然后我打破循环。

我正在研究多线程,但我不太确定如何使用 tkinter 执行此操作,因为我通常是 tkinter 的新手

最终 id 想要这样做

def listen(event):
while 1:
#listennnn
#exit condition then break

root = Tk()
deploy = Button(root, text="Listen")
deploy.bind("<Button-1>", listen)
deploy.pack()
root.mainloop()

您可以将退出条件用于以下构造:

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

有几个选项。

创建自己的事件循环

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

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

与此类似的替代方案:

asyncio集成到您的tkinter计划中

如果你熟悉 asyncio 风格,这可能会做得很好。它还支持该语言。

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

对音频使用单独的进程

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

这种方法的最大优点是:

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

对音频使用单独的线程

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

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

最新更新