2017-02-20 5 views
0

私のプログラムでmvc-modelを使用しようとしています。私は私のファイル間でpubsubを使って通信します。私はpubsubを使う代わりにコミュニケーションする別の方法があるのだろうかと思っていましたか?異なるクラスと.pyファイル間のpython通信

私の特定の問題:私は2つのファイルがあります。ファイル1では、ファイル2の情報が必要なif構造体があります。フレームBで特定のパネルが隠れている場合、またはフレームBでパネルが表示されている場合はフレームAを開くことはできません。

ファイル1からファイル2にpubsubメッセージを送信して、パネルが非表示になっているかどうかを尋ねることができました。その後、ファイル2は返信メッセージを返すことができます。しかし、これは最も効率的な方法ですか?

のTx

EDIT:https://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

EDIT 2:私はのpubsub方法に問題を '解決' をここで説明したように、私はwxPythonのを使用して、私はの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:

1)の設計: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

pubsub?どのライブラリ/ツールでこれを使用していますか?パネル?あなたはGUIフレームワーク/ライブラリを使用していますか?あなたの質問にはより多くのタグが必要なので、人々はより良​​いアイデアを得ることができます。 「ファイル間の通信」は奇妙に聞こえる - 正確に何を達成しようとしているのですか? – mguijarr

+0

"pubsub message"というものはありません。publish-subscribeについて説明したシナリオがあなたの望むものではなく、複数のサブスクライバに公開されるメッセージは何ですか、プロセスのintermessaging(またはスレッドに依存します"Frame A"と "Frame B"の意味) – niceman

+0

pub.sendmessage()よりも効率的かどうかを調べるために 'threads'を調べます。 tx。 – VeVi

答えて

0

私はお勧め3つの事があります。送信者対受信者

pubsubアーキテクチャでは、コンポーネントは決して他のこれはパブリッシュサブスクリプションの匿名性の原則に違反するためです。パブリッシャーがリスナーを知らず、パブリッシャーが何も知らないようにアプリケーションを設計する必要があります。たいていの場合、各側は、利用可能なメッセージと、ペイロードを知っています。

したがって、Aが特定の状態にある場合にのみAが何かをしなければならない場合、AとBをpub-subパターンで切り離したい場合、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パネルには、ユーザーが何らかの情報を入力することを許可するなどの目的があります。または、ユーザーが「シンプル」v「アドバンス」のようなオプションを選択した場合にのみパネルが表示されるか、購入カートに入れます。トピックはBにおけるパネルのユーザー中心の目的にちなんで命名されなければならない、ではないあなたがpypubsubの代わりに

# 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)バージョンを使用するような話題は、に関連するGUIの実装部品の後

最後に、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にアップグレードすることを強くお勧めします。

関連する問題