Tk()、Toplevel() 和 winfo_toplevel()。它们之间的区别以及如何以及何时有效使用?

Tk(), Toplevel() and winfo_toplevel(). Difference between them and how and when to use effectively?

我正在尝试了解如何创建小部件。我发现上面三个函数被用于创建一个小部件,但我无法想出一个比另一个的区别和优势。尽管如此,我看了 仍然让我感到困惑(而且它也没有说任何关于 winfo_toplevel 的事情)。

这是我的代码。

from tkinter import *

root = Tk()
root.title("Root widget")
root.mainloop()

window = Toplevel()
window.title("Window widget")
window.mainloop()

在 运行 上面的代码 "Root" 小部件正在创建中。在关闭 "Root" 时,创建了两个小部件,其中一个标题为 "Window widget",另一个是不需要的。在关闭不需要的小部件时,"Window widget" 也会被破坏。 这里实际发生了什么以及如何克服?

另一个示例:

class ldo(Frame):
    def __init__(self, master = None):
        Frame.__init__(self,master)
        self.grid()
        self.appOutline()

    def appOutline(self):
        top = self.winfo_toplevel()
        self.menuBar = Menu(top)
        top["menu"] = self.menuBar
        self.subMenu1 = Menu(self.menuBar)
        self.menuBar.add_cascade(label = "File", menu = self.subMenu1)

app = ldo()
app.master.title("Sample UI")
app.mainloop()

另一方面,此代码使用 winfo_toplevel(),其中小部件看起来非常好。在这里,我的假设是,Frame 扮演创建小部件的角色,而 winfo_toplevel() 是其他 tkinter 项目的增强工具。但想知道它实际上做了什么。

但是,下面的代码片段不起作用:

winf = winfo_Toplevel()
winf.title("Winfo Widget")
winf.mainloop()

并返回这样的错误:

winf = winfo_Toplevel()
NameError: name 'winfo_Toplevel' is not defined

Tk()、Toplevel() 和 winfo_Toplevel() 之间的确切区别是什么。什么时候应该有效使用。寻找真正更好的理解。

On running above code "Root" widget is getting created. On closing "Root", two widgets are created with one titled "Window widget" and other being unwanted. On closing unwanted widget, "Window widget" is also getting destroyed. What is actually happening here and how to overcome?

当您在没有实际 Tk() 实例的情况下创建任何小部件时,会自动创建一个 Tk() 实例,从而导致在第一部分的第二部分时出现不需要的类似 Toplevel 的小部件代码片段运行。此外,当在没有 master 选项的情况下创建小部件时,假定该实例是 Tk 实例之一的子实例,在上述情况下,只有一个,就是那个那是自动创建的。当一个父级被销毁时,它下面的所有小部件也会被销毁,因此当您关闭作为 Tk 实例的不需要的小部件时,Toplevel 实例也会随着其父级被销毁而被销毁。

在第二部分,winfo_toplevel 再次引用自动创建的 Tk 实例,并以自动创建的 Tk 作为父实例创建其他子实例,这在技术上应该没问题但是与我假设的创建相同 GUI 的标准方法相比,作为代码更难维护。


winf = winfo_Toplevel()
winf.title("Winfo Widget")
winf.mainloop()

在上面的代码段中,除非导入或以其他方式定义,否则 winfo_Toplevel 没有任何意义,首先,它与 winfo_toplevel 不同,因为 python 区分大小写。其次,即使 不区分大小写,它仍然会抛出错误,因为它是一个方法并且它缺少第一个位置参数,这是 class 的对象实例,其中 winfo_toplevel 方法也被定义为.

本质上,您正在尝试使用不区分大小写的方法拼写,就好像它是一个 class 名称,例如 ToplevelTkwinfo_toplevel几乎与.

无关

检查以下代码:

import tkinter as tk

root = tk.Tk()
root.title("This is the actual Tk instance, root")

toplevel = tk.Toplevel(root)
toplevel.title("This is a Toplevel, whose parent is root"),

r_lbl = tk.Label(text="""This label is a children to the default master, 
    as it lacks the first positional argument for an explicit parent 
    assignment.""")

r_lbl2 = tk.Label(r_lbl.winfo_toplevel(), text="""This label checks who the
    toplevel parent for r_lbl is, and then selects that parent as a parent
    to itself.""")

r_lbl3 = tk.Label(root, text="""This label will appear on root, as it's
    explicitly passed as the first positional argument, which is the parent,
    as root.""")

t_lbl = tk.Label(toplevel, text="""This label will appear on toplevel, as it's
    explicitly passed as the first positional argument, which is the parent,
    as toplevel.""")

t_lbl2 = tk.Label(t_lbl.winfo_toplevel(), text="""This label checks who the
    toplevel parent for t_lbl is, and then selects that parent as a parent
    to itself.""")

r_lbl.pack()
r_lbl2.pack()
r_lbl3.pack()
t_lbl.pack()
t_lbl2.pack()
root.mainloop()

总而言之,Tk 虽然是一个 Toplevel 小部件,但也是 在线程中运行的整个 GUI 的 tcl 解释器。可以存在不止一个, 因为通常它的多个实例是不合理的,但也有 必须 至少存在一个实例才能拥有 GUI。

Toplevel 可以被认为是 Tk 实例的唯一可视部分,当需要多个 window-like widgets 时可以使用它。

最后,winfo_toplevel 只是一个方法 returns 一个小部件所在的 Toplevel 类父级的引用,是 [=17= 的一个实例的父级] 或 Tk.