为什么Tkinter Toplevel对象被摧毁?

时间:2015-02-06 03:13:40

标签: python tkinter

在下面的代码中,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()

2 个答案:

答案 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通信。什么时候 - 他们都去了。