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

cs2*_*612 5 python tkinter widget python-3.x toplevel

我试图了解如何创建小部件。而且我发现以上三个函数正在用于创建窗口小部件,但是我无法提出一个窗口与另一个窗口的区别和优势。即使,我看了一下这个答案,仍然让我感到困惑(它也没说什么winfo_toplevel)。

这是我的代码。

from tkinter import *

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

window = Toplevel()
window.title("Window widget")
window.mainloop()
Run Code Online (Sandbox Code Playgroud)

在上面的代码上运行时,将创建“ Root”小部件。在关闭“根”时,将创建两个小部件,其中一个标题为“窗口小部件”,而另一个则不需要。关闭不需要的小部件时,“窗口小部件”也将被销毁。这里实际上发生了什么以及如何克服?

另一个示例:

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()
Run Code Online (Sandbox Code Playgroud)

另一方面,此代码使用的winfo_toplevel()是小部件看起来很好的地方。在这里,我的假设是,它Frame起着创建小部件的作用,并且winfo_toplevel()是其他tkinter项目的增强工具。但是想知道它实际上在做什么。

但是,以下代码段不起作用:

winf = winfo_Toplevel()
winf.title("Winfo Widget")
winf.mainloop()
Run Code Online (Sandbox Code Playgroud)

并返回这样的错误:

winf = winfo_Toplevel()
NameError: name 'winfo_Toplevel' is not defined
Run Code Online (Sandbox Code Playgroud)

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

Nae*_*Nae 7

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

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

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


winf = winfo_Toplevel()
winf.title("Winfo Widget")
winf.mainloop()
Run Code Online (Sandbox Code Playgroud)

在上面的代码段中,除非导入或者另外定义winfo_Toplevel没有意义,首先,它winfo_toplevel不像python那样区分大小写。其次,即使不区分大小写,它仍然会抛出错误,因为它是一个方法并且它缺少第一个位置参数,它winfo_toplevel是也定义了该方法的类的对象实例。

从本质上讲,您正在尝试使用不区分大小写的方法拼写,就好像它是一个类名,例如Toplevelor Tk,这winfo_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()
Run Code Online (Sandbox Code Playgroud)

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

Toplevel可以认为是一个Tk实例唯一的可视化部分,可以在需要多个类似窗口的小部件时使用。

最后,winfo_toplevel只是一个方法返回Toplevel小部件所在的类似父级的引用,父级是 aToplevel或 a的实例Tk