我是Brian! 我对Python 2、3和tkinter有一定的经验。但是,我永远无法完全理解大多数使用tkinter模块的python程序员使用这种常见的tkinter代码段的方式:
为确保我得到人们的适当答复,这个问题与以下主题有关:类,继承,内置在函数中的super()和在tkinter中进行“母版”育儿强>。 它们已经包含在标签部分。
我知道这很无聊,但是为了回答这个问题,我需要给您一个关于我要寻找的内容的清晰概念,这意味着这个问题与代码理解/推理有关。
我们从以下代码开始:
import tkinter as tk
class App(tk.Frame):
def __init__(self,master):
super().__init__(master)
self.lbl = Label(master,text="This is a label sample.")
self.lbl.pack()
root = tk.Tk()
program = App(root)
program.mainloop()
我们的目标是了解,如果我们所有的内部小部件都无法完全使用父级的 init ()方法(如指示的“ master”),那么重要性/作用是什么?父类的类作为主类,而不是tkinter Tk()对象。 (通过分析,您将更好地理解该提案。)
代码以语句import tkinter as tk
开头。然后,我们可以使用tk
命名空间作为对tkinter
模块的引用。
下一行声明一个名为“ App”的新类,该类成为该子类并继承“ tk.Frame”方法。
以代码为参考(以便于理解):
root = tk.Tk()
program = App(root)
现在我们可以使用实际有效名称来引用参数
tk.Tk()
作为参数在 App()的 __init__()
方法中传递:
因此我们将其添加到图形中。
在创建App()
实例时,self
引用了实例program
,而master
引用了root
,即tk.Tk()
。 / p>
下一行是super().__init__(master)
,它将覆盖tk.Frame
__init__()
方法,并使用App的master
值插入master
参数。
因此,我们可以将其称为tk.Frame.__init__(tk.Tk())
然后使用tk.Label()
创建一个Label(master,text="This is a label sample.")
小部件,将App()的master参数作为Label()的小部件master。
此后,tk.Label()
小部件被打包(对于该问题而言无关紧要)。
现在,根据某些程序员的说法, App(tk.Frame)
和 super().__init__(master)
行将创建一个框架小部件,其中所有元素均已声明 App()
中将会发生。
但是问题是...
我们为什么必须设置该环境,如您在下图中所看到的, tk.Label()
的主文件是 tk.Tk()
否 tk.Frame
?
我是否对概念有误解,并且这两个语句在代码中具有实际重要性?
谢谢。
答案 0 :(得分:0)
我们的目标是了解,如果我们所有的内部小部件都不会完全以父级的类作为其母版,那么用指示的“母版”覆盖父类的init()方法的重要性/作用是什么,而不是tkinter Tk()对象。
如果内部小部件 not 没有self
或其后代之一作为主节点,则不应从tk.Frame
继承。如果该类中的所有对象都放在根窗口中,则根本没有理由从任何tk类中继承。
换句话说,您应该任一
tk.Frame
,并使在__init__
中创建的所有小部件成为self
的子代,或者是其后代之一或 将这两种技术混合在一起是没有意义的,也不应该这样做。