Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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 了解Tkinter\uuu init中的父级和控制器___Python_Tkinter - Fatal编程技术网

Python 了解Tkinter\uuu init中的父级和控制器__

Python 了解Tkinter\uuu init中的父级和控制器__,python,tkinter,Python,Tkinter,我想了解以下代码的含义: 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=

我想了解以下代码的含义:

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的函数,但是为什么要使用控制器来调用该函数呢?

粗略地说,原始代码1试图使用伪(模型、视图和控制器)体系结构。虽然没有“模型”部分,但只有“视图”(一些帧)和“控制器”(主应用程序)。因此,对控制器对象的引用。最初的代码实际上是为了展示如何“堆叠”帧而编写的,因此它的MVC实现非常肤浅,文档也不多,因为这不是示例的重点

要回答您的具体问题:

self表示当前对象。这是类的任何方法的常见第一个参数。正如您所建议的,它类似于Java的this

parent表示用作当前对象父对象的小部件。tkinter中除根窗口外的所有窗口小部件都需要父窗口(有时也称为主窗口)

控制器表示一些其他对象,这些对象被设计为作为多页小部件的公共交互点。这是一种试图将页面解耦的尝试。也就是说,每个页面不需要知道其他页面。如果它想与另一个页面交互,例如使其可见,它可以要求控制器使其可见

您询问“已经定义了一个名为show_frame的函数,但是为什么要使用控制器来调用此函数?”请注意,
show_frame
是在一个单独的类中定义的,在本例中是主程序类。它没有在其他类中定义。为了让其他类能够调用它,它们必须在主类的实例上调用它。该实例在这些其他类的上下文中命名为
controller



1注意:尽管您可能在在线教程中找到了原始代码,但它最初来自此stackoverflow答案:

它们是该方法的参数。是什么让你对他们感到困惑?这里的
\uuuu init\uuuu
没有什么特别之处,只是它是使用传递给实例化调用的参数自动调用的。“我相信self在Java中与此类似”-是的。“父级和控制器有什么用?”-它们只是另外两个初始化参数。在Tkinter中,您通常会将新小部件所在的父小部件传递给每个新小部件,以定义整个UI的树<代码>控制器显然可以用来控制整个UI,而不是让一个小部件负责全局更改。代码似乎来自@jornsharpe:实际上,最初的代码来自我2011年的回答:。你链接到的问题是指互联网上的一个教程,它似乎几乎一字不差地复制了这个答案,而且没有署名:(@BryanOakley-ha,这真的完成了所有的循环!只有一个问题,那么在tkinter程序的主循环中初始化了哪些类,抛出了一个“控制器”对于正在初始化的类,这是在INIT???@VasanthNagKV捕获并初始化的控制器:“throw”是一个奇怪的词选择。但是,是的,主程序作为“controller”传递给每个对象非常感谢Bryan!现在所有的困惑都消除了,事情在我的脑海中也清晰了!所以我现在将继续下一步!关于使用“throw”,确实是一个奇怪的词语选择!我的错!:)