我正在尝试为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中只有一个画布小部件,这很好用。但是,稍后添加更多画布可能会造成问题。
答案 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杂志。