我想了解以下代码的含义:
class PageOne(tk.Frame):
def __init__(self, parent, controller):
什么是self
,parent
和controller
?这些工具的作用和范围是什么?
我相信self
与Java中的this
相似,但parent
和controller
有什么用?
稍后在代码流程中我可以看到:
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
已经定义了一个名为show_frame
的函数,但是为什么控制器被用来调用这个函数?
答案 0 :(得分:13)
粗略地说,原始代码 1 试图使用伪 - MVC(模型,视图和控制器)架构。虽然没有"模型"部分 - 只有一个"视图" (一些帧)和一个"控制器" (主要应用)。因此,对控制器对象的引用。原始代码实际上是为了展示如何" stack"框架,因此它的MVC实现非常浅,并且没有记录,因为这不是示例的重点。
回答您的具体问题:
self 表示当前对象。这是类的任何方法的常见第一个参数。正如您所建议的那样,它类似于Java的 this 。
parent 表示一个小部件,用作当前对象的父级。除根窗口外,tkinter中的所有小部件都需要父级(有时也称为 master )
控制器表示一些其他对象,旨在充当多个小部件页面的公共交互点。这是尝试解耦页面。也就是说,每个页面都不需要知道其他页面。如果它想要与另一个页面交互,例如使其可见,它可以要求控制器使其可见。
您问过"有一个已定义的函数叫做show_frame,但是为什么控制器被用来调用这个函数?" 注意show_frame
已定义在一个单独的类中,在这种情况下是主程序类。它没有在其他类中定义。对于其他类可以调用它,它们必须在主类的实例上调用它。该实例在这些其他类的上下文中被命名为controller
。
1 注意:即使您可能在在线教程中找到原始代码,它最初来自此stackoverflow答案:Switch between two frames in tkinter