在下面的代码中,tk
不是函数Toplevel
创建的launch()
对象的父级。但是,当我使用tk
销毁tk.destroy()
时,Toplevel窗口就会消失。
Toplevel寡妇被摧毁了吗?如果是这样,Toplevel.destroy()
如何被调用?
from tkinter import *
def launch():
Toplevel()
tk = Tk()
frame = Frame(tk, relief="ridge", borderwidth=2)
frame.pack(fill="both", expand=1)
label = Label(frame, text="Hello, World")
label.pack(fill=X, expand=1)
button1 = Button(frame, text="Exit", command=tk.destroy)
button2 = Button(frame, text="Launch", command=launch)
button1.pack(side="bottom")
button2.pack(side="bottom")
tk.mainloop()
答案 0 :(得分:5)
使应用程序保持运行的是Tk
实例的主循环,它是所有小部件的父级。当你销毁它时,所有小部件也会被销毁。
请记住,对于每个Tk实例,都有一个关联的 Tcl 解释器,我会尝试更详细地给出关闭窗口时会发生什么的答案,基于docs Tk的字符串以及 tkinter 模块的相关类和方法。
Tk派生自2个类: Misc 和 Wm 。在Misc类中,您可以找到退出方法的界面和文档:
def quit(self):
"""Quit the Tcl interpreter. All widgets will be destroyed."""
self.tk.quit()
您可以在Tk类的destroy
方法下找到以下内容:
def destroy(self):
"""Destroy this and all descendants widgets. This will
end the application of this Tcl interpreter."""
Tk 类中的 destroy 方法在某些时候也会调用 Misc destroy 方法>类,在那里你还可以找到另一个文档:
def destroy(self):
"""Internal function.
Delete all Tcl commands created for
this widget in the Tcl interpreter."""
这并没有说Tcl解释器也被停止了(就像上面描述的 quit 方法一样)。
构造Tk实例时,会调用名为_loadtk
的方法。在此方法中,在Tk窗口关闭时设置protocol
:
self.protocol("WM_DELETE_WINDOW", self.destroy)
如您所见,destroy
(而不是退出)与窗口的结束事件相关联。
这意味着当你关闭窗口时,Tk实例及其所有子节点都被销毁,但Tcl解释器没有停止。
答案 1 :(得分:3)
Tkinter.Tk
是所有tkinter窗口的大型poppa爷爷。它运行逻辑并与OS通信。什么时候 - 他们都去了。