Python 2.7
我为我的Tkinter GUI编写了一个Download sources
方法,而不是使用标准run
,当我关闭窗口时,即使在实现mainloop
之后,它总是会出错。在SO的其他地方建议的协议。我尝试在协议回调中调用WM_DELETE_WINDOW
并从循环中调用exit
,但Python最后一次总是通过循环。这是为什么?
return
这是运行循环:
class FrameApp(object):
def __init__(self):
...
self.rootWin.protocol("WM_DELETE_WINDOW", self.callback_destroy)
self.winRunning = False
def callback_destroy(self):
self.winRunning = False
self.rootWin.destroy() # go away, window
exit() # GET OUT
结果:
File" /usr/lib/python2.7/lib-tk/Tkinter.py" ;,第972行,在 update_idletasks self.tk.call('更新',' idletasks') _tkinter.TclError:无法调用"更新"命令:应用程序已被销毁
答案 0 :(得分:1)
如果没有mainloop,tkinter将无法获取WM_DELETE_WINDOW
消息来调用您的退出函数。 (或者更确切地说,它只能在update_idletasks
调用的〜毫秒内捕获任何内容,因为它不会排队,因为tkinter没有事件循环(从而排队)因为你永远不会如果它不能与Window Manager(系统)进行通信,它就无法捕获信号,如果它没有循环,它就无法进行通信。
要解决它,只需使用event / main循环。使run
函数保存所需的任何状态,并在您希望的任何时间间隔内调用after
。
另一方面,不要将time.sleep
与tkinter一起使用 - 它可以防止它做任何事情(而且剩下的40ms睡眠时间可能比其余的时间长,所以你' d有41毫秒的等待时间和0.5毫秒的可点击性。相反,只需仔细配置您的root.after
语句(您也可以计算其中的内容)