基本上我试图创建一个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 线程可能会缺少运行时间。