如何定义 Tkinter 控制器?

How to define Tkinter controller?

代码背景:试图让弹出 window 调用另一个 class 中的函数。

我无法正确定义控制器和配置我的功能。我收到一个关于控制器在传递给 popupWindow class 之前未定义的错误,这是有道理的,因为 我没有在其他地方定义控制器,但我没有不知道在哪里做:

NameError: name 'controller' is not defined

我研究了这些过去的答案以寻求帮助,但仍然卡住了:

Calling Tkinter frame controller from function rather then button command

Calling functions from a Tkinter Frame to another

这里是我的简化代码(注意:我在class BoundingBox[=中的其他函数中定义了values函数中的各种变量34=] 但为了清晰和缩短代码,我没有包含这些函数):

我也不明白如何使 get_page 函数起作用定义控制器。

import tkinter as tk
from tkinter import *

class BoundingBox(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

    def get_page(self, page_class):
        return self.frames[page_class]

    def popup(self):
        self.w=popupWindow(self.master,controller)

    def values(self):     
        print(self.start_x, self.start_y, self.end_x, self.end_y, self.totwidth, self.totheight, self.value1, self.value2)
        self.allcord.append([self.start_x, self.start_y, self.end_x, self.end_y, self.totwidth, self.totheight, self.value1, self.value2])
        self.allrect.append(self.rect)
        print (len(self.allcord))     

class popupWindow(tk.Toplevel):
    def __init__(self, master, controller):
        super().__init__(master)
        self.controller = controller
        self.l1=Label(self,text="Breed")
        self.l1.grid(row=0, column=0)
        self.e1=Entry(self)
        self.e1.grid(row=0, column=1)
        self.l2=Label(self,text="Color")
        self.l2.grid(row=1, column=0)
        self.e2=Entry(self)
        self.e2.grid(row=1, column=1)
        self.b=Button(self,text='Save',command=self.cleanup)
        self.b.grid(row=2, column=1)

    def cleanup(self):
        self.value1=self.e1.get()
        self.value2=self.e2.get()
        self.controller.values()
        self.top.destroy()

if __name__ == "__main__":
    draw = BoundingBox()
    draw.mainloop()


在这种特定情况下,controller 只是指主要 window。因此,您只需将 self 作为 controller 参数传递:

def popup(self):
    self.w=popupWindow(self.master, self)

注意 cleanup 方法如何调用 self.controller.values()values是在BoundingBox中定义的,所以很明显popupwindow被设计成让BoundingBox作为控制器。