【发布时间】:2011-11-18 11:57:51
【问题描述】:
我有点怀疑编写 Python 应用程序是否遵循 wxPython 上的 MVC 规则。
例子:
主窗体
PanelLst(ListCtrl + 一些按钮)
PanelTree (TreeCtrl + ProgressBar)
我创建了 3 个视图(ListView、TreeView、ButtonView) 我还创建了 3 个控制器(ListController、TreeController、ButtonController) 在主应用程序中,我有一个管理一些模型的对象 (objManager)。
所有 3 个控制器都有一个指向 App.objManager() 的指针,用于执行某些操作。
例如:点击ListController中的一行执行App.objManager().foo1
在ButtonController中点击一个按钮执行App.objManager().bar1, ecc...
问题在这里...我对那些“我的”结构有疑问...
- 在每个使用它的控制器中传递指向 objManager 的指针是否正确?
- 视图/控制器如何以正确的方式相互通信? 实际上我使用类似于模型的类似方式。使用 wxPython publisher.sendMessage(EVENT, data) 和 publisher.subscribe(EVENT, onEvent) 但我认为这不是最好的方法..
下一个疑问:
TreeController,从模型接收消息。必须在树中加载一个大列表,显示进度。 我已经使用了一些 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)
TreeCTRL()
# 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)
TreeCTRL()
# 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)
什么解决方案更好?在第一个解决方案中,是发送消息以更新 GUI 的 VIEW。在第二种解决方案中是发送消息的控制器.. 不确定这两种解决方案是否是控制器/视图之间通信的最佳实践..
感谢和抱歉我的英语不好......
【问题讨论】:
标签: python model-view-controller wxpython rules controllers