6

我的问题如下。来自网络背景,我这样做没有问题,但在 Python 桌面应用程序中,我真的看不出根据 MVC 模式组织代码的最佳方法是什么。

我想根据用户输入创建一个窗口,当按下按钮时,它会显示数据库中可用的类似条目。窗户是我的风景。

所以基本上这些是关系:

在此处输入图像描述

1)通讯控制器 --> 视图

控制器有一个视图实例,并且可以使用其公开的方法,例如 view.show_data()。我认为这是要走的路。

# Controller
my_view = View()
...
my_view.show_data(whatever_data)

2)通讯视图-->控制器

当用户插入一些文本时,必须触发控制器中的一个方法,以便它可以向模型询问数据库中的必要数据。问题是我不知道视图告诉控制器它必须触发该方法的最佳方式是什么。

我的第一个想法是将控制器的引用传递给视图,并将事件绑定到视图上,如下所示:

# Controller
my_view = View(self)
my_model = Model()
...

def on_user_input(self):
     # process the input
     user_input = ...
     self.my_model.method_to_get_info(user_input)

和观点:

# View
def __init__(self, controller):
    self.controller_reference = controller
    self.launch_gui()
    self.config_binds()

def launch_gui(self):
    # ... configure all the GUI itself
    self.button = ...


def config_binds(self):
    self.button.Bind(wx.EVT_BUTTON, self.controller_reference.on_user_input())

但我认为这种“闭环”关系并不是一个非常干净的解决方案。视图在控制器中被引用,控制器在视图中。我认为它在视图和控制器之间建立了紧密的关系。

这样做的方法是什么?

4

1 回答 1

4

该视图应该触发事件。通常,您不会将事件直接发送到控制器,而是 GUI 的框架通用事件处理程序。所讨论的事件通常是诸如“已按下键”和“有人移动鼠标”之类的事件。

在您的情况下,更“高级”的 MVC 可以很好地让各个部分相互了解。你告诉视图它的控制器是什么对象是非常好的。重要的部分是所有部件都使用定义良好的接口,因此部件是可更换的。

如您所见,这与模型-视图-控制器的常见 Web 概念完全不同,模型-视图-控制器实际上根本不是模型-视图-控制器,而是用词不当,应该称为模型-视图-模板。

于 2013-01-08T12:28:08.463 回答