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

biz*_*izi 6 python multithreading tkinter python-2.7

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

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

我知道的所有方法:一旦root被销毁wminfo_exists(),state()所有返回错误.

biz*_*izi 8

如果有人遇到同样的问题,我会为此添加我的解决方法.我是按照这里的建议.我拦截了窗口的关闭事件,设置了标志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)
Run Code Online (Sandbox Code Playgroud)


Pet*_*aro 3

如果您使用的是这样的东西:

import Tkinter

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

而不是:root.destroy()那么 quit 方法将杀死 Tcl 解释器,而不仅仅是从主循环中退出并删除所有小部件。所以一旦你打电话,root.quit()你就可以确定,你root已经彻底死了!

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


笔记:

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

  • 感谢您的回答。我遇到的问题是,在 `root.quit()` 之后,我仍然有一些线程在运行,我需要让我的线程知道 `root` 已经死了。现在我必须拦截 quit 方法并设置一个全局变量来让我的线程知道“root”已经死了。我想知道是否还有其他解决方案。 (2认同)