我试图在我的程序中使用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
答案 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.