不同类和.py文件之间的python通信

时间:2017-02-20 14:41:56

标签: python wxpython publish-subscribe

我试图在我的程序中使用mvc-model。我使用pubsub在我的文件之间进行通信。我想知道是否有另一种沟通方式而不是使用pubsub?

我的具体问题:我有2个文件。在文件1中,我有一个if结构,它需要来自文件2的信息。如果某个面板隐藏在框架B中,则必须打开框架A,如果面板在框架B中可见,则框架A不能打开

我可以将文件1中的pubsub消息发送到文件2,询问该面板是否被隐藏,然后文件2可以发回带有答案的消息。但这是最有效的方式吗?

的Tx

编辑:我使用wxpython并且我使用pubsub库,如下所述:https://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

编辑2:我已经解决了#39; pubsub方式的问题。但我仍然想知道这是不是最好的方法。我的代码:

文件1:browser_menubar_view.py:

pub.subscribe(self.on_status_MA_panel, "RETURN_STATUS_MA_PANEL")
def on_open_microanalysis(self, event):
    #check if MA panel view is hidden or not. If hidden, MA frame may open, if not, MA frame must be closed
    #send message to choosepanel to see if ma_panel_view is hidden or not
    pub.sendMessage("STATUS_MA_PANEL") #to choosePanel_view.py
    if self.statusMAPanelShown == False:
        pub.sendMessage("Unhide_MA_With_question") #to microanalyse_view
    else:
        wx.MessageBox('Microanalysis is already open in filterview.', 'Info', wx.OK | wx.ICON_INFORMATION)

文件2:choosePanel_view.py

pub.subscribe(self.on_status_MA_panel, "STATUS_MA_PANEL")
def on_status_MA_panel(self,message):
    if self.MApanel.IsShown() == True:
        self.statusMAPanelShown = True
    else:
        self.statusMAPanelShown = False
    pub.sendMessage("RETURN_STATUS_MA_PANEL",Container(data=self.statusMAPanelShown)) #to browser_MB_view

1 个答案:

答案 0 :(得分:0)

我推荐三件事:

1)发送者与接收者的设计

在pubsub体系结构中,组件从不询问其他组件的信息,因为这会违反发布 - 订阅的匿名原则:您必须设计应用程序,以便发布者对他们的听众一无所知,并且听众对发布者一无所知。最多,每一方都知道哪些消息可用,哪些有效负载。

所以在pubsub中,如果A只有在B处于特定状态时必须做某事,并且你想通过pub-sub模式解耦A和B,那么A不会问B状态是什么,而是B每当它发生变化时都会发布它的状态如果没有任何组件对B的状态感兴趣,B不关心,也不知道。

因此,在您的应用中,让B发布其状态:

# B file: 
pub.sendMessage('certain panel state', hidden=state)

# A file: 
def listener(hidden):
    print(hidden)
pub.subscribe(listener, 'certain panel state')

2)消息主题的设计

我还建议将主题名称抽象为以用户为中心而不是以GUI实现为中心。这里,隐藏在B中的面板是B的实现细节,A不应该知道。但是,B的这个面板确实有一个目的,例如允许用户输入一些信息,或者如果用户选择了一些选项,如“简单”和“高级”,或者如果用户有项目,则可能只显示面板在他们的购物车中。该主题应以B中面板的以用户为中心的目的命名,而不是在该主题所涉及的GUI实现组件之后,因此您将使用

# B file: 
pub.sendMessage('cart_state', cart_empty=cart.is_empty) # example

# A file: 
def listener(cart_empty: bool):
    print(cart_empty)
pub.subscribe(listener, 'cart_state')

3)pypubsub的版本

最后,确保您使用的是来自https://github.com/schollii/pypubsub的最新pubsub(是的,它曾经是在sourceforge.net上)。 wxPython中包含的pypubsub版本有点旧(我仍然在更新wxPython以使用它),但是pypubsub实际上是它自己独立的项目,可以非常容易地安装并与wxPython分开安装。如果您发现任何错误,请在pypubsub的github页面或pypubsub论坛上发帖(请参阅http://pypubsub.readthedocs.io/en/stable/)。如果您仍在使用python 2.x,则仅限于pypubsub 3.3,我强烈建议您升级到python 3.