bgu*_*ach 6 python model-view-controller user-interface controller view
我的问题如下。来自网络背景,我没有问题可以做到这一点,但在 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())
但我认为这种“闭环”关系并不是一个非常干净的解决方案。视图在控制器中被引用,控制器在视图中被引用。我认为它在视图和控制器之间建立了紧密的关系。
有什么方法可以做到这一点?
该视图应该触发事件。通常,您不会将事件直接发送到控制器,而是发送到 GUI 框架的通用事件处理程序。所讨论的事件通常是诸如“已按下某个键”和“有人移动了鼠标”之类的事件。
在您的情况下,更“高级”的 MVC 可以很好地让各部分相互了解。你告诉视图它的控制器是什么对象是完全没问题的。重要的是所有部件都使用定义良好的接口,以便部件可以互换。
正如您所看到的,这与模型-视图-控制器的常见 Web 概念有很大不同,模型-视图-控制器实际上根本不是模型-视图-控制器,而是用词不当,应该称为模型-视图-模板。
| 归档时间: | 
 | 
| 查看次数: | 7560 次 | 
| 最近记录: |