python Tkinter,检查root是否已被销毁?

时间:2013-11-18 02:29:55

标签: python multithreading python-2.7 tkinter

我正在使用Tkinter和线程编写应用程序。

我得到的问题是,关闭主应用程序后,某些线程仍在运行,我需要一种方法来检查根窗口是否已被销毁以避免TclError: can't invoke "wm" command

我知道的所有方法:wminfo_exists()state()都会在根被销毁后返回错误。

2 个答案:

答案 0 :(得分:7)

我会为此添加我的解决方法,以防有人遇到同样的问题。我遵循here的建议。我拦截了windows的结束事件,设置了标记root已经死亡的标志,并在需要时检查该标志。

exitFlag = False

def thread_method():
    global root, exitFlag
    if not exitFlag:
        // execute the code relate to root

def on_quit():
    global exitFlag
    exitFlag = True
    root.destroy()

root.protocol("WM_DELETE_WINDOW", on_quit)

答案 1 :(得分:2)

如果您使用的是这样的话:

import Tkinter

root = Tkinter.Tk()
root.bind('<space>', lambda e: root.quit())  # quitting by pressing spacebar
root.mainloop()

而不是:root.destroy()然后quit方法将杀死Tcl解释器,而不仅仅是从mainloop中断并删除所有小部件。因此,一旦您致电root.quit(),您就可以确定,root已完全死亡!

您建议的所有其他方法(例如:wminfo_exists())仅在至少存在一个有效Tk时才可用。


注意:

如果您使用多个主循环,则应使用destroy方法确保您的 main 主循环不会被杀死 - 但我不认为这是你的情况。