Python 来自控制器的tkinter绑定事件

Python 来自控制器的tkinter绑定事件,python,tkinter,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

我正在尝试为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)
我需要将事件绑定从视图移动到控制器。如何从controller类绑定在view类中创建的画布小部件

通过使用root.bind\u classCanvas、self.view.select将整个画布小部件绑定到事件,我在controller类中找到了一个临时解决方案


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

对于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
        # ...

您也可以在创建视图对象后绑定控制器,但在将控制器的代码与视图控制器耦合时,应该知道视图始终具有self.canvas属性。

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

然而,在GUI>elements小部件的控制方面,传统的MVC范围存在不足。MVC不能处理数据管理、事件>管理和应用程序流的复杂性。作为MVC三元组的一种改编,HMVC->层次模型-视图-控制器-范例试图解决上述>问题

Jason Cai、Ranjit Kapila和Gaurav Pal,2000年7月。HMVC:。JavaWorld杂志


我的select方法主要更新一些视图,因此理想情况下应该在视图中。所以这并不能解决我的问题。除了耦合还有其他选择吗?@QuakiGabbar也许这个选择根本不使用MVC。这听起来可能有点过激,但最终设计模式是针对常见问题的文档化方法。如果你想让解决方案适合你的问题,那么你就迫使它变得比应该的更复杂。我只开发了一个中型/大型Tkinter应用程序,当我尝试使用MVC时,它简直是势不可挡。考虑如果没有MVC的解决方案有足够的Tcter代码与你的模型交互,也许你就不需要其他的东西了。