【问题标题】:Analysis and understanding of a tkinter code fragment一个tkinter代码片段的分析和理解
【发布时间】: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模块的引用。

IMAGE001

下一行声明了一个名为“App”的新类,它成为“tk.Frame”方法的子类并继承了“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__() 方法,插入带有应用程序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() 的主人是 tk.Tk() NOT tk.Frame? 我是否有一些概念误解,这两个语句在代码中具有实际重要性?

提前致谢。

【问题讨论】:

  • super 中的要点是你不必通过任何东西。 super().__init__() 可以正常工作。此外,您提供的代码没有多大意义,因为您从 Frame 类继承,但您仍将标签应用于根 Tk() 窗口。这违背了拥有框架的目的。

标签: python-3.x class inheritance tkinter super


【解决方案1】:

我们的目标是了解在用指定的“master”覆盖父类的 init() 方法时的重要性/角色,如果我们所有的内部小部件都不会完全将父类的类作为它们的主类,而不是 tkinter Tk() 对象。

如果内部小部件没有有self 或其后代之一作为它的主人,你不应该从tk.Frame 继承。如果该类中的所有对象都放置在根窗口中,则根本没有理由从任何 tk 类继承。

换句话说,你应该要么

  • 从tk.Frame 继承,并使__init__ 中创建的所有小部件成为self 或其后代之一的孩子,或
  • 不从 tk.Frame 继承,并将所有小部件放置在您想要的任何位置。

将这两种技术混合在一起没有意义,也不应该这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2014-01-25
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多