我正在尝试使用OOP方法来理解程序,但这似乎并不理想。
我可以遵循下面的代码(在网上找到),但是我对和之间的关系root
my_gui
有疑问(位于类定义下面)。
import tkinter as tk
class MyFirstGUI:
def __init__(self, master):
self.master = master
master.title("A simple GUI")
self.label = tk.Label(master, text="This is our first GUI!")
self.label.pack()
self.greet_button = tk.Button(master, text="Greet", command=self.greet)
self.greet_button.pack()
def greet(self):
print("Greetings!")
root = tk.Tk()
my_gui = MyFirstGUI(root)
root.mainloop()
我知道init方法中的label和button对象每个都进入主对象(这是根对象),但是令我困惑的是区分my_gui
和root
执行了init方法之后。
my_gui
和root
成为一个,同样的事情,或者是root
现在的一个子集my_gui
?my_gui
对象了吗?self.master = master
做什么?我想我真正想知道的是关系my_gui
和root
。
“对象与分配给它的tkinter对象之间有什么区别?”
我认为您是指该部分:
root = tk.Tk()
my_gui = MyFirstGUI(root)
这root
是不完全分配给一个对象,而是被作为参数传递的对象。然后,将该参数分配为该对象的属性。这不等于说root
现在是一个子集,my_gui
只要蟒蛇层次而言。
my_gui
object首先使用root
对象self.master
,然后将其分配为属性,然后再将其作为其子代创建小部件。
“如果init函数执行后它们本质上是相同的,那么就不需要该
my_gui
对象了,对吗?”
他们是不一样的,它们是唯一的类的实例。
您可以将其MyFirstGUI
视为GUI的一个构造函数类。在上述情况下,它是为构建的,root
但也可以为某些(Toplevel
)小部件构建,root
稍后可能具有:
my_toplevel = tk.Toplevel(root)
my_gui2 = MyFirstGUI(my_toplevel)
它甚至可以为当前具有的窗口小部件Label
和/或当前具有的Button
窗口小部件构造,如果删除了该行root
,它们也属于属性。my_gui
master.title(...)
“到底在
self.master = master
做什么?”
该行使用方法变量(master
),并将其作为属性分配给使用MyFirstGUI
class创建的每个特定对象。它是然后可用于修改/下使用中的所有子范围的MyFirstGUI
(并且在该范围的目的,my_gui
是可用的)。其用法的一个示例__init__
是在中使用该行创建一个标签:
self.label = tk.Label(master, text="This is our first GUI!")
而在另一种方法下这是不可能的,例如,greet,
如果 self.master = master
不存在的话。如具有:
def greet(self):
print("Greetings!")
self.label2 = tk.Label(master, text="Greetings!")
self.label2.pack()
并且在以下情况下调用my_gui.greet()
会返回NameError: name 'master' is not defined
错误:
def greet(self):
print("Greetings!")
self.label2 = tk.Label(self.master, text="Greetings!")
self.label2.pack()
然后再次拨打电话即可my_gui.greet()
按预期效果完美运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句