分析和理解tkinter代码片段

时间:2019-03-01 16:32:48

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

我是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模块的引用。

IMAGE001

下一行声明一个名为“ App”的新类,该类成为该子类并继承“ tk.Frame”方法。

IMAGE002

以代码为参考(以便于理解):

root = tk.Tk()
program = App(root)

现在我们可以使用实际有效名称来引用参数

tk.Tk()作为参数在 App()的 __init__()方法中传递: 因此我们将其添加到图形中。

IMAGE003

在创建App()实例时,self引用了实例program,而master引用了root,即tk.Tk()。 / p>

下一行是super().__init__(master),它将覆盖tk.Frame __init__()方法,并使用App的master值插入master参数。 因此,我们可以将其称为tk.Frame.__init__(tk.Tk())

IMAGE004

然后使用tk.Label()创建一个Label(master,text="This is a label sample.")小部件,将App()的master参数作为Label()的小部件master。

IMAGE005

此后,tk.Label()小部件被打包(对于该问题而言无关紧要)。

概念和问题

IMAGE005

现在,根据某些程序员的说法, App(tk.Frame) super().__init__(master) 行将创建一个框架小部件,其中所有元素均已声明 App() 中将会发生。

但是问题是...

我们为什么必须设置该环境,如您在下图中所看到的, tk.Label() 的主文件是 tk.Tk() tk.Frame 我是否对概念有误解,并且这两个语句在代码中具有实际重要性?

谢谢。

1 个答案:

答案 0 :(得分:0)

  

我们的目标是了解,如果我们所有的内部小部件都不会完全以父级的类作为其母版,那么用指示的“母版”覆盖父类的init()方法的重要性/作用是什么,而不是tkinter Tk()对象。

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

换句话说,您应该任一

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

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