为什么 Tkinter Toplevel 对象被销毁?

Why is Tkinter Toplevel object being destroyed?

在下面的代码中,tk 不是函数 launch() 创建的 Toplevel 对象的父对象。但是,当我使用 tk.destroy() 销毁 tk 时,顶层 window 消失了。

顶级寡妇被摧毁了吗?如果是这样,如何调用 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()

Tkinter.Tk 是所有 tkinter windows 的大爷爷。它运行逻辑并与 OS 通信。当它消失时——它们都会消失。

让您的应用程序保持 运行 的是 Tk 实例的主循环,它是所有小部件的父级。当你销毁它时,所有的小部件也会被销毁。


请记住,对于每个 Tk 实例,都有一个关联的 Tcl 解释器,我将尝试就关闭 [=65= 时发生的情况给出更详细的答案],基于 Tk 的文档字符串和相关的 classes 和 tkinter 模块的方法。

Tk 源自 2 classes:MiscWm。在 Misc class 中,您可以找到 quit 方法的接口和文档:

def quit(self):
    """Quit the Tcl interpreter. All widgets will be destroyed."""
    self.tk.quit()

在Tkclass的destroy方法下可以找到以下内容:

def destroy(self):
    """Destroy this and all descendants widgets. This will
    end the application of this Tcl interpreter."""

Tk class 中的 destroy 方法在某些时候也会调用 destroy Misc class 的 方法,您还可以在那里找到另一个文档:

def destroy(self):
    """Internal function.
    Delete all Tcl commands created for
    this widget in the Tcl interpreter."""

这并不是说 Tcl 解释器也停止了(就像上面描述的 quit 方法)。

在构造Tk实例时,调用了一个名为_loadtk的方法。在这个方法中,当Tkwindow关闭时设置protocol

self.protocol("WM_DELETE_WINDOW", self.destroy)

如您所见,destroy(而不是 quit)与 window 的关闭事件相关联。


这意味着当您关闭 window 时,Tk 实例及其所有子实例都会被销毁,但 Tcl 解释器不会停止。