如何定义 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
作为控制器。
代码背景:试图让弹出 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
作为控制器。