使用多个控制器遵循MVC规则
我对用Python写一个遵循MVC规则的wxPython应用程序有一点疑问。
举个例子:
主界面
列表面板(包含列表控件和一些按钮)
树形面板(包含树控件和进度条)
我创建了三个视图(列表视图、树形视图、按钮视图),也创建了三个控制器(列表控制器、树形控制器、按钮控制器)。在主应用程序中,我有一个对象(objManager),它管理一些模型。
这三个控制器都有一个指向App.objManager()的指针,用来执行一些操作。
比如:在列表控制器中点击一行会执行 App.objManager().foo1
在按钮控制器中点击一个按钮会执行 App.objManager().bar1,等等...
这里有个问题...我对我的结构有些疑惑...
- 在每个使用objManager的控制器中传递一个指向objManager的指针,这样做正确吗?
- 视图和控制器之间应该如何正确地沟通?目前我使用的方式类似于模型,使用wxPython的publisher.sendMessage(EVENT, data)和publisher.subscribe(EVENT, onEvent),但我觉得这不是最好的方法...
接下来的疑问:
树形控制器接收到来自模型的消息后,需要在树中加载一个大列表,并显示进度。我已经使用了一个线程和一些wx.PostEvent,但有什么更好的解决方案吗?
解决方案1:
进度条()
# Callback via publisher.subscrive(self.onUpdateStatus, "UPDATE_STATUS")
def onUpdateStatus(self, msg)
nValue = msg.data
self.gauge.setValue(nValue)
树视图()
def loadTree(self, items):
for nItem, item in enumerate(items):
tree.addItem(item)
pub.sendMessage(UPDATE_STATUS, item)
树控件()
# Callback function via publisher.subscribe(self.onLoadTree, "LOAD_TREE")
def onLoadTree():
items = self.objManager.getList()
self.hTreeView.loadTree(items)
解决方案2
进度条()
# Callback via publisher.subscrive(self.onUpdateStatus, "UPDATE_STATUS")
def onUpdateStatus(self, msg)
nValue = msg.data
self.gauge.setValue(nValue)
树视图()
def loadTree(self, item):
self.addTreeItem(item)
树控件()
# Callback function via publisher.subscribe(self.onLoadTree, "LOAD_TREE")
def onLoadTree():
items = self.objManager.getList()
for nItem, item in enumerate(items):
self.hTreeView.loadTree(item)
pub.sendMessage(UPDATE_STATUS, item)
哪个解决方案更好?在第一个解决方案中,是视图发送消息来更新界面;在第二个解决方案中,是控制器发送消息...我不确定这两种解决方案是否是控制器和视图之间沟通的最佳实践。
谢谢,抱歉我的英语不好...
1 个回答
1
我觉得使用发布-订阅模式(pubsub)在模型和控制器之间进行沟通是一个非常合理的方法。几个月前,我和另一位wxPython开发者一起创建了一个示例应用,展示了这种方法的一个实现。你可以在这里查看我们的代码:https://bitbucket.org/driscollis/medialocker
希望这能帮助你更好地组织你的代码。当然,代码设计是一个非常个人化和主观的话题。你需要使用你觉得舒适并且最理解的方法。