Python 3.x tkinter代码片段的分析与理解
我是布莱恩! 我对Python 2、3和tkinter有一些经验。但是,我始终无法完全理解大多数使用tkinter模块的python程序员使用这段常见tkinter代码的方式: 为了确保人们对我的回答恰当,这个问题涉及以下主题:类、继承、super()内置函数和tkinter中的“主”育儿。它们已包含在“标记”部分中Python 3.x tkinter代码片段的分析与理解,python-3.x,class,inheritance,tkinter,super,Python 3.x,Class,Inheritance,Tkinter,Super,我是布莱恩! 我对Python 2、3和tkinter有一些经验。但是,我始终无法完全理解大多数使用tkinter模块的python程序员使用这段常见tkinter代码的方式: 为了确保人们对我的回答恰当,这个问题涉及以下主题:类、继承、super()内置函数和tkinter中的“主”育儿。它们已包含在“标记”部分中 代码 我知道这很无聊,但为了回答这个问题,我需要给你一个我想要的清晰概念,这意味着这个问题是关于代码理解/推理的 我们从以下代码开始: import tkinter as tk
代码 我知道这很无聊,但为了回答这个问题,我需要给你一个我想要的清晰概念,这意味着这个问题是关于代码理解/推理的 我们从以下代码开始:
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()
我们的目标是了解,如果我们所有的内部小部件都没有将父类的类作为它们的主类,而不是tkinter Tk()对象,那么用指定的“master”重写父类的init方法的重要性/作用是什么。(通过分析,您将更好地理解提案)
分析
代码以语句import tkinter as tk
开头。然后我们可以使用tk
名称空间作为tkinter
模块的引用
下一行声明了一个名为“App”的新类,它成为“tk.Frame”方法的子类并继承该方法
将代码作为参考(以便于理解):
现在,我们可以使用实际有效的名称引用参数
tk.tk()
在App()的\uuuu init\uuu()方法上作为参数传递:
因此,我们将其添加到图形中
创建App()
实例时,self
引用实例program
,master
引用root
,即tk.tk()
下一行是super()。
因此,我们可以将其转换为tk.Frame.\uu初始化(tk.tk())
然后使用Label(master,text=“这是一个标签示例”)
创建一个tk.Label()
小部件,将App()的主参数作为Label()的小部件主参数
然后,打包tk.Label()
小部件(这对于问题来说无关紧要)
概念与问题
根据一些程序员的说法,现在应用程序(tk.Frame)
和super()。
行将创建一个框架小部件,其中应用程序()
中声明的所有元素都将发生。
但问题是
如果如下图所示,tk.Label()
的主机是tk.tk()
不是tk.Frame
?
我是否有一些概念上的误解,而这两条语句在代码中具有实际重要性?
提前谢谢
我们的目标是了解,如果我们所有的内部小部件都没有将父类类类作为它们的主类,而不是tkinter Tk()对象,那么用指示的“master”重写父类init()方法的重要性/作用是什么
如果内部小部件没有self
或它的一个子部件作为其主部件,则不应该从tk.Frame
继承。如果任何tk类中的所有对象都放在根窗口中,则根本没有理由从该类继承
换句话说,你应该
- 从
tk.Frame
继承,并使在\uuuu init\uuuu
中创建的所有小部件成为self
的子部件或其子部件之一,或
- 不要从tk.Frame继承,而是将所有小部件放在您想要的任何地方
将这两种技术混合在一起没有意义,也不应该这样做
我们的目标是了解,如果我们所有的内部小部件都没有将父类类类作为它们的主类,而不是tkinter Tk()对象,那么用指示的“master”重写父类init()方法的重要性/作用是什么
如果内部小部件没有self
或它的一个子部件作为其主部件,则不应该从tk.Frame
继承。如果任何tk类中的所有对象都放在根窗口中,则根本没有理由从该类继承
换句话说,你应该
- 从
tk.Frame
继承,并使在\uuuu init\uuuu
中创建的所有小部件成为self
的子部件或其子部件之一,或
- 不要从tk.Frame继承,而是将所有小部件放在您想要的任何地方
将这两种技术混合在一起是没有意义的,也不应该这样做。super的要点是,你不必通过任何考试super()。\uuuu init\uuuuu()
可以正常工作。另外,您提供的代码没有多大意义,因为您从Frame
类继承,但仍然将标签应用于根Tk()
窗口。这与拥有一个框架的目的背道而驰。super中的要点是你不需要通过任何东西super()。\uuuu init\uuuuu()
可以正常工作。另外,您提供的代码没有多大意义,因为您从Frame
类继承,但仍然将标签应用于根Tk()
窗口。这违背了拥有框架的目的。
root = tk.Tk()
program = App(root)