【发布时间】:2019-07-23 17:29:27
【问题描述】:
我是布赖恩! 我对 Python 2、3 和 tkinter 有一些经验。但是,我永远无法完全理解大多数使用 tkinter 模块的 Python 程序员使用的常见 tkinter 代码的方式:
为了确保我得到人们的适当回应,这个问题是关于以下主题的:类、继承、内置函数的 super() 和 tkinter 中的“master”育儿强>。 它们已经包含在标签部分中。
代码
我知道这很无聊,但为了回答这个问题,我需要给你一个关于我在寻找什么的清晰概念,暗示这个问题是关于代码理解/推理的。
我们从这段代码开始:
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()
我们的目标是了解使用指定的“master”覆盖父类的 init() 方法的重要性/角色,如果我们所有的内部小部件都不完全具有父母的类作为他们的主人,而不是 tkinter Tk() 对象。 (通过分析,您将更好地理解提案)。
分析
代码以语句import tkinter as tk 开头。然后我们可以使用tk命名空间作为tkinter模块的引用。
下一行声明了一个名为“App”的新类,它成为“tk.Frame”方法的子类并继承了“tk.Frame”方法。
将代码作为参考(便于理解):
root = tk.Tk()
program = App(root)
现在我们可以使用实际有效的名称来引用参数了
tk.Tk() 作为参数传递给 App() 的 __init__() 方法:
所以我们将它添加到图形中。
随着App() 实例的创建,self 引用实例program,master 引用root,即tk.Tk()。
下一行是super().__init__(master),它覆盖tk.Frame __init__() 方法,插入带有应用程序master 值的master 参数。
因此我们可以将其转为tk.Frame.__init__(tk.Tk())
然后使用Label(master,text="This is a label sample.") 创建一个tk.Label() 小部件,将App() 的主参数作为Label() 的小部件主参数。
之后,tk.Label() 小部件被打包(这对于问题来说无关紧要)。
概念和问题
现在,根据一些程序员的说法, App(tk.Frame) 和 super().__init__(master) 行将创建一个 Frame 小部件,其中所有元素在 App() 将会发生。
但问题是……
为什么我们必须设置那个环境,如果如下图所示, tk.Label() 的主人是 tk.Tk() NOT tk.Frame?
我是否有一些概念误解,这两个语句在代码中具有实际重要性?
提前致谢。
【问题讨论】:
-
super 中的要点是你不必通过任何东西。
super().__init__()可以正常工作。此外,您提供的代码没有多大意义,因为您从Frame类继承,但您仍将标签应用于根Tk()窗口。这违背了拥有框架的目的。
标签: python-3.x class inheritance tkinter super