来自控制器的tkinter绑定事件

时间:2013-06-15 21:32:57

标签: python tkinter

我正在尝试为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

我有另一个班级'Controller'

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)将整个Canvas小部件绑定到事件,在控制器类中找到了一个临时解决方案。

目前我的GUI中只有一个画布小部件,这很好用。但是,稍后添加更多画布可能会造成问题。

2 个答案:

答案 0 :(得分: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
        # ...

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

答案 1 :(得分:0)

在努力用tkinter实现MVC后,我发现了一篇文章,说明为什么MVC可能不是GUI编程的最佳选择。

  

&#34;然而,传统的MVC范围在控制GUI&gt;元素(小部件)方面不尽如人意。 MVC不处理数据管理,事件&gt;管理和应用程序流的复杂性。作为MVC三元组的改编,HMVC - >分层 - 模型 - 视图 - 控制器 - 范例试图纠正上述一些&gt;问题。&#34;

     

Jason Cai,Ranjit Kapila和Gaurav Pal(2000年7月)。 &#34; HMVC:The layered pattern for >developing strong client tiers&#34;。 JavaWorld杂志。