繁体   English   中英

为什么Tkinter顶级对象被破坏?

[英]Why is Tkinter Toplevel object being destroyed?

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

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

使您的应用程序运行的是Tk实例的mainloop,它是所有小部件的父级。 销毁它时,所有小部件也会被销毁。


请记住,对于每个Tk实例,都有一个关联的Tcl解释器,我将根据Tk的docs字符串以及tkinter模块的关联类和方法,尝试给出关闭窗口时会发生的更详细的答案。 。

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

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 (而不是quit )与窗口的关闭事件相关。


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

Tkinter.Tk是所有Tkinter.Tk窗口的大Tkinter.Tk 它运行逻辑并与OS通信。 一切顺利-他们全都去了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM