我对编写Python应用程序是否遵循wxPython上的MVC规则有点怀疑。
例子:
主窗体
PanelLst(ListCtrl+一些按钮)
PanelTree(TreeCtrl+ProgressBar)
我创建了3个视图(ListView、TreeView、ButtonView)
我还创建了3个控制器(ListController、TreeController、buttoncontroller)
在主应用程序中,我有一个对象(objManager)来管理一些模型。
所有3个控制器都有一个指向App.objManager()的指针,用于执行某些操作。
例如:单击ListController execute App.objManager().foo1中的一行
点击ButtonController execute 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的消息的视图。第二种解决方案是发送消息的控制器。。
不确定这2个解决方案是否是控制器/视图之间通信的最佳实践。。
谢谢你,也很抱歉我英语不好。。。
最佳答案
我认为使用pubsub是模型和控制器之间进行通信的一种完全合法的方式。几个月前,我与另一个wxPython开发人员一起创建了一个示例应用程序,演示了一种实现方法。你可以在这里看到我们的代码:https://bitbucket.org/driscollis/medialocker
我希望这能帮助你组织代码。当然,代码设计是一个非常个人化和主观化的话题。你需要使用你觉得舒服的东西,并且最好地理解它。
关于python - 遵循多个 Controller 的MVC规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7441777/