了解 Tkinter __init__ 中的父级和控制器
Posted
技术标签:
【中文标题】了解 Tkinter __init__ 中的父级和控制器【英文标题】:Understanding parent and controller in Tkinter __init__ 【发布时间】:2015-12-28 03:38:39 【问题描述】:我想了解以下代码的含义:
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
的函数,但是为什么要使用控制器来调用这个函数呢?
【问题讨论】:
它们是方法的参数。什么让你对它们感到困惑?这里__init__
没有什么特别之处,只是它是使用传递给实例化调用的参数自动调用的。
“我相信 self 在 Java 中类似于 this” - 是的。 “父级和控制器有什么用?” - 它们只是另外两个初始化参数。在 Tkinter 中,您通常将新小部件所在的 parent
小部件传递给每个新小部件,以定义整个 UI 的树。 controller
显然是可以用来控制整体 UI 的东西,而不是让小部件负责全局更改。
代码似乎来自***.com/q/29444725/3001761
@jonrsharpe:实际上,原始代码来自我 2011 年的这个答案:***.com/a/7557028/7432。您链接到的问题是指互联网上的一个教程,该教程似乎几乎逐字复制了该答案 - 并且没有署名:-(
@BryanOakley 哈哈,这真的已经完成了!
【参考方案1】:
粗略地说,原始代码1试图使用伪MVC(模型、视图和控制器)架构。虽然没有“模型”部分——只有一个“视图”(一些框架)和一个“控制器”(主应用程序)。因此,对控制器对象的引用。原始代码实际上是为了展示如何“堆叠”帧而编写的,因此它的 MVC 实现非常肤浅且文档不足,因为这不是示例的重点。
回答您的具体问题:
self 表示当前对象。这是类的任何方法的常见第一个参数。正如您所建议的,它类似于 Java 的 this。
parent 表示充当当前对象父级的小部件。 tkinter 中除根窗口外的所有小部件都需要父级(有时也称为 master)
controller 代表一些其他对象,旨在充当多个小部件页面的公共交互点。这是一种解耦页面的尝试。也就是说,每个页面不需要知道其他页面。如果它想与另一个页面进行交互,例如使其可见,它可以请求控制器使其可见。
您问“已经定义了一个名为 show_frame 的函数,但是为什么要使用控制器来调用这个函数?” 请注意,show_frame
是在一个单独的类中定义的,在这种情况下主程序类。它没有在其他类中定义。为了让其他类能够调用它,它们必须在主类的实例上调用它。在这些其他类的上下文中,该实例被命名为controller
。
1 注意:尽管您可能在在线教程中找到了原始代码,但它最初来自这个 *** 答案:Switch between two frames in tkinter
【讨论】:
只有一个问题,那么在 tkinter 程序的主循环中初始化的类会向正在初始化的类抛出一个“控制器”吗?所以这是在 INIT???? 处被捕获和初始化的控制器 @VasanthNagKV:“throw”是一个奇怪的词选择。但是,是的,主程序作为“控制器”参数传递给每个对象。 非常感谢布莱恩!现在所有的困惑都被清除了,事情在我的脑海中变得清晰了!所以我现在将继续接下来的事情!而关于使用“投掷”,确实是一个奇怪的选择词!我的错 ! :)以上是关于了解 Tkinter __init__ 中的父级和控制器的主要内容,如果未能解决你的问题,请参考以下文章
从 __init__ 以外的方法/函数内部更改 tkinter 框架