遵循多个控制器的MVC规则

时间:2011-09-16 08:04:10

标签: python model-view-controller wxpython rules controllers

我对编写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 ...

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

  1. 是否正确传递指向使用它的每个控制器中的objManager的指针?
  2. 视图/控制器如何以正确的方式在他人之间进行通信? 实际上我使用类似于模型的方式。使用wxPython publisher.sendMessage(EVENT,数据) publisher.subscribe(EVENT,onEvent),但我认为这不是最佳方式..
  3. 下一个疑问:

    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 .. 不确定这两个解决方案无论如何都是控制器/视图之间通信的最佳实践..

    谢谢,抱歉我的英语不好......

1 个答案:

答案 0 :(得分:1)

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

我希望这有助于您整理代码。当然,代码设计是一个非常个人化和主观的话题。你需要使用你最熟悉的东西并且最好地理解。