tkwait的wait_variable/wait_window/wait_visibility功能是否异常?
Tkinter中
tkwait的嵌套执行异常问题 我近期开始使用tkwait,发现它的部分功能仅在特定条件下生效。比如下面这段顺序执行的代码可以正常运行:
import tkinter as tk def w(seconds): dummy = tk.Toplevel(root) dummy.title(seconds) dummy.after(seconds*1000, lambda x=dummy: x.destroy()) dummy.wait_window(dummy) print(seconds) root = tk.Tk() for i in [5,2,10]: w(i) root.mainloop()
这段代码符合预期:循环调用函数时,函数会阻塞对应时长,直到窗口销毁后循环才继续执行,输出顺序为5、2、10。
但在事件驱动环境中,tkwait调用会出现问题。官方文档有这样的说明:
If an event handler invokes tkwait again, the nested call to tkwait must complete before the outer call can complete.
比如下面的事件驱动示例:
import tkinter as tk def w(seconds): dummy = tk.Toplevel(root) dummy.title(seconds) dummy.after(seconds*1000, lambda x=dummy: x.destroy()) dummy.wait_window(dummy) print(seconds) root = tk.Tk() btn1 = tk.Button( root, command=lambda : w(5), text = '5 seconds') btn2 = tk.Button( root, command=lambda : w(2), text = '2 seconds') btn3 = tk.Button( root, command=lambda : w(10), text = '10 seconds') btn1.pack() btn2.pack() btn3.pack() root.mainloop()
如果按顺序点击按钮5 seconds、2 seconds、10 seconds,输出顺序会变成10、2、5,而非预期的5、2、10。推测是因为等待时嵌套的事件循环(或等效主循环)仍在正常处理事件导致的。
我是不是误用了这个功能?几乎所有Tkinter对话框都使用tkwait,但我之前没见过这种行为。另外,如果wait_something没有被释放,还会导致进程无法正常结束。
内容的提问来源于stack exchange,提问作者Thingamabobs
相关产品推荐
相关产品推荐

