我的问题如下。来自网络背景,我这样做没有问题,但在 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())
但我认为这种“闭环”关系并不是一个非常干净的解决方案。视图在控制器中被引用,控制器在视图中。我认为它在视图和控制器之间建立了紧密的关系。
这样做的方法是什么?