2017-02-20 12 views
0

Я пытаюсь использовать mvc-модель в своей программе. Я использую pubsub для связи между моими файлами. Мне было интересно, есть ли другой способ общения вместо использования pubsub?python связь между различными классами и .py-файлами

Моя специфическая проблема: у меня есть 2 файла. В файле 1 у меня есть if-структура, где ему нужна информация из файла 2. Рамка A должна быть открыта, если определенная панель скрыта в кадре B, или кадр A не открывается, если панель видна во фрейме B.

Я могу отправить сообщение pubsub из файла 1 в файл 2, чтобы узнать, скрыта ли панель, а затем файл 2 может отправить сообщение с ответом. Но это самый эффективный способ?

Tx

EDIT: Я использую WxPython и я использую библиотеку PubSub, как описано здесь: https://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

EDIT 2: Я 'решить' проблему с 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

pubsub? Какую библиотеку/инструмент вы используете для этого? Панели? вы используете фреймворк/библиотеку gui? Я думаю, вам нужно больше тегов для вашего вопроса, чтобы люди могли лучше подумать. «Общение между файлами» звучит странно - чего вы пытаетесь достичь именно? – mguijarr

+0

нет такой вещи, как «сообщение pubsub», что есть сообщение, которое публикуется нескольким подписчикам, в соответствии с описанным вами сценарием. Подписка на подписку - это не то, что вы хотите, то, что вы хотите, - это процесс intermessaging (или потоки в зависимости от на то, что вы подразумеваете под «Frame A» и «Frame B») – niceman

+0

Я рассмотрю «потоки», чтобы узнать, эффективен ли он, чем pub.sendmessage(). ТХ. – VeVi

ответ

0

Есть 3 вещи, которые я рекомендую:

1) Дизайн отправителя и приемника

В архитектуре pubsub компоненты никогда не запрашивают информацию от других потому что это нарушит принцип анонимности публикации-подписки: вы должны создать свое приложение, чтобы издатели ничего не знали о своих слушателях, и слушатели ничего не знают об издателях. В лучшем случае каждая сторона знает, какие сообщения доступны, с какой полезной нагрузкой.

Так что в pubsub, если A должен что-то делать, только если B находится в определенном состоянии, и вы хотите отделить 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-определенного имеет такую ​​цель, которая позволяет пользователю вводить некоторую информацию, или, возможно, панель отображается только в том случае, если пользователь выбрал какой-то вариант, например «простой» или «расширенный», или если у пользователя есть элементы в их корзину покупок. Тема должна быть названа в честь ориентированного на пользователя цели панели в B, а не после того, как компонент реализации графического интерфейса пользователя, что тема относится к, так что вы бы использовать вместо

# 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

Наконец, убедитесь, что вы используете последний pubsub от https://github.com/schollii/pypubsub (да, это было на sourceforge.net).Версия pypubsub, которая входит в состав wxPython, немного устарела (я все еще в процессе обновления wxPython, чтобы ее использовать), но pypubsub на самом деле является ее собственным отдельным проектом, который можно установить очень легко и отдельно от wxPython. Если вы обнаружили какие-либо ошибки, напишите на странице github pypubsub или в форуме pypubsub (см. http://pypubsub.readthedocs.io/en/stable/). Если вы все еще используете python 2.x, вы ограничены pypubsub 3.3, и я настоятельно рекомендую вам перейти на python 3.