【问题标题】:Follow MVC rules with multiple controllers使用多个控制器遵循 MVC 规则
【发布时间】: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...

问题在这里...我对那些“我的”结构有疑问...

  1. 在每个使用它的控制器中传递指向 objManager 的指针是否正确?
  2. 视图/控制器如何以正确的方式相互通信? 实际上我使用类似于模型的类似方式。使用 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


    【解决方案1】:

    我认为使用 pubsub 是在模型和控制器之间进行通信的一种完全合法的方式。几个月前,我与另一位 wxPython 开发人员一起创建了一个示例应用程序,该示例应用程序演示了执行此操作的一种方法。您可以在这里查看我们的代码:https://bitbucket.org/driscollis/medialocker

    我希望这可以帮助您组织代码。当然,代码设计是一个非常个人和主观的话题。你需要使用你最熟悉和最了解的东西。

    【讨论】:

    • 经过几个月的编码,我发现python中的用户pubsub非常有用和快速..
    • @Kaiser69 这个答案应该被授予赏金吗?
    猜你喜欢
    • 2017-12-13
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多