我对编写Python应用程序有点怀疑,遵循wxPython上的MVC规则。
示例:
的MainForm
PanelLst(ListCtrl +一些按钮)
PanelTree(TreeCtrl + ProgressBar)
我创建了3个视图(ListView,TreeView,ButtonView) 我还创建了3个控制器(ListController,TreeController,ButtonControllor) 在主应用程序中,我有一个管理某些模型的对象(objManager)。
所有3个控制器都有一个指向App.objManager()的指针,用于执行某些操作。
例如:点击ListController中的一行执行 App.objManager()。foo1
点击ButtonController中的按钮执行 App.objManager()。bar1 ,ecc ...
这里的问题......我对那些“我的”结构有疑问......
下一个疑问:
TreeController,从模型接收消息。必须在树中加载一个大列表,显示进度。 我已经使用了一些wx.PostEvent的线程,但是哪种解决方案更好?
解决方案1:
进度()
# Callback via publisher.subscrive(self.onUpdateStatus, "UPDATE_STATUS")
def onUpdateStatus(self, msg)
nValue = msg.data
self.gauge.setValue(nValue)
的TreeView()
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)
的TreeView()
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)
哪种解决方案更好?在第一个解决方案中,VIEW是发送用于更新GUI的消息。在第二个解决方案是发送消息的CONTROLLER .. 不确定这两个解决方案无论如何都是控制器/视图之间通信的最佳实践..
谢谢,抱歉我的英语不好......
答案 0 :(得分:1)
我认为使用pubsub是在模型和控制器之间进行通信的完全合法的方式。几个月前,我与另一位wxPython开发人员合作创建了一个示例应用程序,演示了一种方法。您可以在此处查看我们的代码:https://bitbucket.org/driscollis/medialocker
我希望这有助于您整理代码。当然,代码设计是一个非常个人化和主观的话题。你需要使用你最熟悉的东西并且最好地理解。