我试图了解如何创建窗口小部件。我发现上面三个函数正在用于创建一个小部件,但我无法想出一个与另一个相比的差异和优势。尽管如此,我已经看过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()之间的确切区别是什么。什么时候应该有效地使用它。寻找真正更好的理解。
答案 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
方法也被定义对
基本上,您尝试使用不区分大小写的方法拼写,就好像它是Toplevel
或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()
总之,Tk
是一个Toplevel
窗口小部件,它也是 tcl解释器,用于在线程中运行的整个GUI。可以有多个存在,which is discouraged,因为它的多个实例通常是不合理的,但还有至少存在一个实例才能拥有GUI。
Toplevel
可以被认为是Tk
实例的唯一可视部分,并且可以在需要多个类似窗口的小部件时使用。
最后,winfo_toplevel
只是一个方法返回Toplevel
的引用 - 就像小部件所在的父级一样,是Toplevel
或{{1}的父实例}}