Tkinter Loop永不干净地退出

时间:2016-07-31 18:56:52

标签: python python-2.7 tkinter tkinter-canvas event-loop

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:无法调用"更新"命令:应用程序已被销毁

1 个答案:

答案 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语句(您也可以计算其中的内容)

相关问题