Python 中 GUI 和控制器类之间的双向通信



为了清楚起见,我将程序简化为2个小类:一个带有单个按钮的GUI,以及一个在单击时将该按钮变为蓝色的控制器。为了使 GUI 能够与控制器通信,它有自己的控制器实例,但是如何让该控制器随后与 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()

如果您不使用其他类,则可以将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的调用,我已经在上面的更改代码中完成了此操作。

最新更新