2024-05-28 18:25:41 发布
网友
我正在使用Tkinter和线程编写一个应用程序。
我遇到的问题是,关闭主应用程序后,一些线程仍在运行,我需要一种方法来检查根窗口是否已被破坏,以避免TclError: can't invoke "wm" command。
TclError: can't invoke "wm" command
我知道的所有方法:wminfo_exists()和state()根目录被破坏后都返回错误。
wminfo_exists()
state()
如果你用的是这样的东西:
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已经完全死了!
root.destroy()
root.quit()
root
您建议的所有其他方法(如:wminfo_exists())仅在至少存在一个有效的Tk时可用。
Tk
注意:
如果您使用多个mainloop,您应该使用destroy方法来确保您的mainmainloop不会被杀死,但我不认为这是您的情况。
我会增加我的解决办法,以防有人遇到同样的问题。我是按照here的建议做的。我截取windows的closing事件来设置标记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)
如果你用的是这样的东西:
而不是:
root.destroy()
那么quit方法将杀死Tcl解释器,而不仅仅是从主循环中断并删除所有小部件。所以一旦你打电话给root.quit()
你就可以确定,你的root
已经完全死了!您建议的所有其他方法(如:
wminfo_exists()
)仅在至少存在一个有效的Tk
时可用。注意:
如果您使用多个mainloop,您应该使用destroy方法来确保您的mainmainloop不会被杀死,但我不认为这是您的情况。
我会增加我的解决办法,以防有人遇到同样的问题。我是按照here的建议做的。我截取windows的closing事件来设置标记
root
的标志已经失效,并在需要时检查该标志。相关问题 更多 >
编程相关推荐