Tkinter:检查根是否已被破坏?

问题描述 投票:0回答:3

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

我遇到的问题是,关闭主应用程序后,某些线程仍在运行,我需要一种方法来检查根窗口是否已被销毁以避免

TclError: can't invoke "wm" command

我知道的所有方法:

wminfo_exists()
state()
一旦根被破坏都会返回错误。

python multithreading python-2.7 tkinter
3个回答
11
投票

我将添加我的解决方法,以防有人遇到同样的问题。我遵循了here的建议。我拦截窗口的关闭事件来设置标记

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)

3
投票

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

import Tkinter

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

而不是:

root.destroy()
那么 quit 方法将终止 Tcl 解释器,而不仅仅是从主循环中退出并删除所有小部件。因此,一旦您致电
root.quit()
,您就可以确定您的
root
已经彻底死机了!

您建议的所有其他方法(例如:

wminfo_exists()
)仅当至少存在一个有效的
Tk
时才可用。


注意:

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


0
投票

我有一个迂回的解决方案。根销毁后,根实例将销毁对其所有子项(UI 元素)的引用。因此,如果您在添加第一个 UI 元素之前不检查根破坏,或者如果您不使用空根实例,则可以使用此:

if len(self.window.children) != 0:
    pass #Code for for not destroyed root
else:
    pass #Code for destroyed root
© www.soinside.com 2019 - 2024. All rights reserved.