一段tkinter代码片段的分析理解
Analysis and understanding of a tkinter code fragment
我是布莱恩!
我对 Python 2、3 和 tkinter 有一些经验。但是,我永远无法完全理解大多数使用 tkinter 模块的 python 程序员使用这段常见的 tkinter 代码的方式:
为了确保我得到人们的适当回应,这个问题是关于以下主题的:类、继承、内置函数 super() 和 "master" 在 tkinter 中育儿。 它们已包含在标签部分。
代码
我知道这很无聊,但为了回答这个问题,我需要让你清楚地了解我在寻找什么,暗示这个问题是关于代码的understanding/reasoning。
我们从这段代码开始:
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()
而我们的 objective 是为了理解 importance/role 在覆盖父级的 class init() 方法时的意义是什么 "master",如果我们所有的内部小部件都不会完全将父对象的 class class 作为它们的主人,而不是 tkinter Tk() 对象。 (通过分析你会更好地理解提案)。
分析
代码以语句 import tkinter as tk
开头。然后我们可以使用 tk
命名空间作为对 tkinter
模块的引用。
IMAGE001
下一行声明了一个名为 "App" 的新 class,它成为 "tk.Frame" 方法的子项并继承了这些方法。
IMAGE002
参考代码(方便理解):
root = tk.Tk()
program = App(root)
现在我们可以用实际有效的名称来引用参数了
tk.Tk()
作为参数传递给 App() 的 __init__()
方法:
所以我们在图形中添加它。
IMAGE003
随着 App()
实例的创建,self
引用实例 program
,master
引用 root
即 tk.Tk()
.
下一行是 super().__init__(master)
,它覆盖了 tk.Frame
__init__()
方法,插入了带有 App 的 master
值的 master
参数。
因此我们可以将其翻译为 tk.Frame.__init__(tk.Tk())
IMAGE004
然后使用 Label(master,text="This is a label sample.")
创建一个 tk.Label()
小部件,将 App() 的主参数作为 Label() 的小部件主参数。
IMAGE005
之后,tk.Label()
小部件被打包(这对问题来说无关紧要)。
概念和问题
IMAGE005
现在,根据一些程序员的说法,App(tk.Frame)
和super().__init__(master)
行是创建一个 Frame 小部件,其中 App()
中所述的所有元素都将发生。
但问题是...
为什么要设置那个环境,如果如下图所示, tk.Label()
的master是 tk.Tk()
不是 tk.Frame
?
我是否对概念有误解,这两个语句在代码中具有实际重要性?
在此先感谢。
And our objective is to understand what's the importance/role in overriding the parent's class init() method with the indicated "master", if all of our internal widgets will won't exactly have the parent's class class as their master, instead the tkinter Tk() object.
如果内部小部件 没有 self
或其后代之一作为其主人,则您不应继承自 tk.Frame
。如果 class 中的所有 objects 都放在根 window.
中,则根本没有理由继承任何 tk classes
换句话说,你应该
- 继承自
tk.Frame
并使在 __init__
中创建的所有小部件成为 self
的 child 或其后代之一, 或
- 不要继承tk.Frame,并将所有小部件放在任何你想要的地方。
将这两种技术混合在一起没有任何意义,也不应该这样做。
我是布莱恩! 我对 Python 2、3 和 tkinter 有一些经验。但是,我永远无法完全理解大多数使用 tkinter 模块的 python 程序员使用这段常见的 tkinter 代码的方式:
为了确保我得到人们的适当回应,这个问题是关于以下主题的:类、继承、内置函数 super() 和 "master" 在 tkinter 中育儿。 它们已包含在标签部分。
代码
我知道这很无聊,但为了回答这个问题,我需要让你清楚地了解我在寻找什么,暗示这个问题是关于代码的understanding/reasoning。
我们从这段代码开始:
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()
而我们的 objective 是为了理解 importance/role 在覆盖父级的 class init() 方法时的意义是什么 "master",如果我们所有的内部小部件都不会完全将父对象的 class class 作为它们的主人,而不是 tkinter Tk() 对象。 (通过分析你会更好地理解提案)。
分析
代码以语句 import tkinter as tk
开头。然后我们可以使用 tk
命名空间作为对 tkinter
模块的引用。
IMAGE001
下一行声明了一个名为 "App" 的新 class,它成为 "tk.Frame" 方法的子项并继承了这些方法。
IMAGE002
参考代码(方便理解):
root = tk.Tk()
program = App(root)
现在我们可以用实际有效的名称来引用参数了
tk.Tk()
作为参数传递给 App() 的 __init__()
方法:
所以我们在图形中添加它。
IMAGE003
随着 App()
实例的创建,self
引用实例 program
,master
引用 root
即 tk.Tk()
.
下一行是 super().__init__(master)
,它覆盖了 tk.Frame
__init__()
方法,插入了带有 App 的 master
值的 master
参数。
因此我们可以将其翻译为 tk.Frame.__init__(tk.Tk())
IMAGE004
然后使用 Label(master,text="This is a label sample.")
创建一个 tk.Label()
小部件,将 App() 的主参数作为 Label() 的小部件主参数。
IMAGE005
之后,tk.Label()
小部件被打包(这对问题来说无关紧要)。
概念和问题
IMAGE005
现在,根据一些程序员的说法,App(tk.Frame)
和super().__init__(master)
行是创建一个 Frame 小部件,其中 App()
中所述的所有元素都将发生。
但问题是...
为什么要设置那个环境,如果如下图所示, tk.Label()
的master是 tk.Tk()
不是 tk.Frame
?
我是否对概念有误解,这两个语句在代码中具有实际重要性?
在此先感谢。
And our objective is to understand what's the importance/role in overriding the parent's class init() method with the indicated "master", if all of our internal widgets will won't exactly have the parent's class class as their master, instead the tkinter Tk() object.
如果内部小部件 没有 self
或其后代之一作为其主人,则您不应继承自 tk.Frame
。如果 class 中的所有 objects 都放在根 window.
换句话说,你应该
- 继承自
tk.Frame
并使在__init__
中创建的所有小部件成为self
的 child 或其后代之一, 或 - 不要继承tk.Frame,并将所有小部件放在任何你想要的地方。
将这两种技术混合在一起没有任何意义,也不应该这样做。