Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x tkinter代码片段的分析与理解_Python 3.x_Class_Inheritance_Tkinter_Super - Fatal编程技术网

Python 3.x 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

我是布莱恩! 我对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()
我们的目标是了解,如果我们所有的内部小部件都没有将父类的类作为它们的主类,而不是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)