0

我正在尝试为 tkinter 程序制定 MVC 结构。

我有一个带有鼠标单击事件绑定的视图类,如下所示

class View():
    def __init__(self, root)
        self.canvas = Canvas(root)
        self.canvas.pack()
        self.canvas.bind("<Button-1>", self.select)

     def select(self):
        # do some thing

我有另一个类“控制器”

class Controller:
    def __init__(self, root):
        self.model = model.Model()
        self.view = view.View(self.model)
        #root.bind_class("Canvas", "<Button-1>", self.view.select)

我需要将事件绑定从视图移动到控制器。如何从控制器类绑定在视图类中创建的画布小部件?

我已经在控制器类中制定了一个临时解决方案,方法是使用root.bind_class("Canvas", "<Button-1>", self.view.select).

目前,我的 GUI 中只有一个画布小部件,并且工作正常。但是,稍后添加更多画布可能会带来问题。

4

2 回答 2

2

使用 MVC 模式,控制器应该响应由与视图交互引起的用户事件。因此,如果您想遵循这种方法,那么select应该在控制器中并且视图只需要知道控制器必须响应的操作:

class View():
    def __init__(self, master, controller):
        self.canvas = Canvas(root)
        self.canvas.pack()
        self.canvas.bind("<Button-1>", controller.select)

class Controller():
    def __init__(self, master):
        self.model = model.Model()
        self.view = view.View(master, self)
    def select(self, event):
        canvas = event.widget
        # ...

您也可以<Button-1>在创建 View 对象后在控制器中绑定,但随后您将控制器的代码与视图耦合(控制器应该知道 View 始终具有self.canvas属性)。

于 2013-06-15T22:18:06.193 回答
0

在尝试使用 tkinter 实现 MVC 之后,我看到了一篇关于为什么 MVC 可能不是 GUI 编程的最佳选择的文章。

“然而,传统的 MVC 范围在 GUI > 元素(小部件)的控制方面存在不足。MVC 不处理数据管理、事件 > 管理和应用程序流的复杂性。作为 MVC 三元组的改编, HMVC -->Hierarchical-Model-View-Controller -- 范式试图解决上述一些>问题。”

Jason Cai、Ranjit Kapila 和 Gaurav Pal(2000 年 7 月)。“HMVC:> 开发强大客户层的分层模式”。Java世界杂志。

于 2013-06-16T01:43:09.217 回答