Python中GUI和Controller类之间的双向通信

时间:2017-11-05 10:55:30

标签: python tkinter

为了清楚起见,我将我的程序简化为2个小类:一个带有单个按钮的GUI,以及一个控制器,当单击时将该按钮变为蓝色。为了使GUI能够与控制器通信,它有自己的Controller实例,但是如何让控制器与GUI通信呢?

class Controller():
def buttonClicked(self):
    # btn['bg'] = 'blue' - how do I reference the button?


class GUI():
def __init__(self,master):
    self.master = master
    self.controller = Controller()
    self.btn = tk.Button(master,command=self.controller.buttonClicked())
    self.btn.pack()


root = tk.Tk()
GUI(root)
root.mainloop()

1 个答案:

答案 0 :(得分:2)

如果您不使用其他课程,则可以将buttonClicked添加到GUI,然后通过self.btn引用该按钮。

如果你需要另一个类,那么你必须传递一个主类的引用,以便使用它的属性。

class Controller():
    def __init__(self, gui):
        self.gui = gui
    def buttonClicked(self):
        self.gui.btn['bg'] = 'blue'


class GUI():
    def __init__(self,master):
        self.master = master
        self.controller = Controller(self)
        self.btn = tk.Button(master,command=self.controller.buttonClicked)
        self.btn.pack()


root = tk.Tk()
GUI(root)
root.mainloop()

通过将self传递给ControllerController的实例可以使用所有变量,包括按钮,并对其进行编辑。

在定义按钮的命令时,您还需要删除对self.controller.buttonClicked的调用,我在上面的修改过的代码中已经完成了。