开发者社区> 问答> 正文

如何定义Tkinter控制器?

代码背景:试图让一个弹出窗口在另一个类中调用一个函数。

我在定义控制器和正确配置功能时遇到麻烦。我在传递给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

展开
收起
is大龙 2020-03-24 19:26:34 469 0
1 条回答
写回答
取消 提交回答
  • 在这种特定情况下,“控制器”仅指代主窗口。因此,您只需要传递self作为controller参数即可:

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

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

    回答来源:stackoverflow

    2020-03-24 19:26:44
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载