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

时间:2018-01-16 10:15:30

标签: python python-3.x tkinter widget toplevel

我试图了解如何创建窗口小部件。我发现上面三个函数正在用于创建一个小部件,但我无法想出一个与另一个相比的差异和优势。尽管如此,我已经看过this answer仍然让我感到困惑(而且它也没有说过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”,其他小部件则不需要。关闭不需要的小部件时,“窗口小部件”也会被破坏。 这里到底发生了什么以及如何克服?

另一个样本:

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()之间的确切区别是什么。什么时候应该有效地使用它。寻找真正更好的理解。

1 个答案:

答案 0 :(得分:4)

  

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

当您创建缺少实际Tk()实例的任何窗口小部件时,会自动创建Tk()实例,从而在第一个代码段的第二部分时产生不需要的类似Toplevel的窗口小部件运行。此外,当在没有master选项的情况下创建窗口小部件时,假设该实例是其中一个Tk实例的子项,在上面的情况下,只有一个,那就是一个自动创建。当父项被销毁时,其下的所有小部件也会被销毁,因此当您关闭作为Tk实例的不需要的小部件时,Toplevel实例也会在其父节点被销毁时被销毁。 / p>

在第二部分,winfo_toplevel再次引用自动创建的Tk实例并创建其他子项,并自动创建Tk作为父项,这应该在技术上很好但是会作为代码维护起来比创建我认为的相同GUI的标准方法更难维护。

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

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

基本上,您尝试使用不区分大小写的方法拼写,就好像它是ToplevelTk这样的类名,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()

总之,Tk是一个Toplevel窗口小部件,它也是 tcl解释器,用于在线程中运行的整个GUI。可以有多个存在,which is discouraged,因为它的多个实例通常是不合理的,但还有至少存在一个实例才能拥有GUI。

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

最后,winfo_toplevel只是一个方法返回Toplevel的引用 - 就像小部件所在的父级一样,是Toplevel或{{1}的父实例}}