了解 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):

什么是selfparentcontroller?这些工具在这里的作用和范围是什么?

我相信self和Java中的this类似,但是parentcontroller有什么用呢?

在后面的代码流中我可以看到:

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__ 中的父级和控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将异步方法绑定到 Tkinter 中的击键?

从 __init__ 以外的方法/函数内部更改 tkinter 框架

从类外部更改Tkinter标签

当父级不从对象继承时,Python 2.x 超级 __init__ 继承不起作用

删除 python 构建源存档中的父目录

tkinter Treeview 小部件插入数据