代码背景:试图让一个弹出窗口在另一个类中调用一个函数。
我在定义控制器和正确配置功能时遇到麻烦。我在传递给popupWindow类之前收到关于未定义控制器的错误,这是有道理的,因为*我没有在其他地方定义控制器,但我不知道在哪里做**:
NameError: name 'controller' is not defined
我研究了以下这些过去的答案以寻求帮助,但仍然遇到困难:
从函数而不是按钮命令调用Tkinter框架控制器
从Tkinter框架到另一个的调用函数
这是我的简化代码(注意:我在BoundingBox类的其他函数中的values函数中定义了各种变量, 但为了清楚起见和缩短代码,我没有包括这些函数):
我也不明白如何使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()
问题来源:stackoverflow
在这种特定情况下,“控制器”仅指代主窗口。因此,您只需要传递self
作为controller
参数即可:
def popup(self):
self.w=popupWindow(self.master, self)
注意cleanup方法是如何调用self.controller.values()的。values在BoundingBox中定义,因此很明显popupwindow被设计为以BoundingBox作为控制器。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。