2014-02-21 3 views
1

Таким образом, после написания кучу мелких, личных приложений WxPython я осевших на организацию программы в серию wx.Panel() s так:получение части программы WxPython общаться друг с другом

class display(wx.Panel): 
    <buttons, sliders, etc> 
    <sizer> 
... 
class selector(wx.Panel): 
    <buttons and stuff> 
    <sizer> 
... 

Тогда я беру эти панели и засунуть их в один кадр, как дети на мастер-панели, в какой момент я могу организовать с помощью классификаторов, как так:

class mainwindow(wx.Frame): 
    master_panel = wx.Panel() 
    display = display(master_panel) 
    selector = selector(master_panel) 

    <sizers and stuff> 

Моя проблема сейчас в том, что две панели нужно каким-то образом общаться друг с другом. Например, если в селекторе щелкнули что-то (например, имя файла), дисплей должен соответствующим образом обновиться.

Первое, что пришло в голову, - использовать существующую систему событий для создания собственных пользовательских событий, а затем привязать их к обработчикам внутри каждой панели, но я не уверен, что это правильный путь. Мое решение для подкласса Panel() создало проблему, которую я иначе не имел бы, или есть лучший способ справиться с этой проблемой межпанельной связи?

ответ

2

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

from wx.lib.pubsub import pub 

class display(wx.Panel): 
    def __init__(self,... whatever): 
     <buttons, sliders, etc> 
     <sizer> 
     pub.subscribe("SELECTION_INFO", self.OnSelection) 

    def OnSelection(self, info): 
     # do stuff with info 

... 
class selector(wx.Panel): 
    def __init__(self, ... whatever) 
     <buttons and stuff> 
     <sizer> 

    def OnSomeButtonPressed(self, event): 
     pub.SendMessage("SELECTION_INFO", info="some useful info about what was pressed") 

... 

Обратите внимание, что вам не нужно получать доступ к главному окну, связанному с этим сообщением между его детьми.

+0

Это именно то, что мне нужно. Я действительно пошел и загрузил модуль отдельно, только чтобы заметить, что он фактически включен в wxPython .... – cornjuliox

+0

Одна вещь, о которой нужно знать: хотя семантика интерфейса подразумевает, что pubsub основан на событиях, на самом деле это не событие, основанное на смысл wx-событий. Когда вы вызываете SendMessage, поток извещения распространяется полностью через код подписчика до того, как возвращается ваш запрос SendMessage. FWIW - это меня охватило удивление, когда я его обнаружил, хотя большую часть времени вам все равно. – GreenAsJade

0

Вы можете использовать родителя, который знает обо всех дочерних панелях, чтобы посредничать между ними, когда дочерняя панель вызывает событие (стандартное или настраиваемое событие), родительский связывает обработчик событий, который вызывает методы на другом чтобы обновить их соответствующим образом.

Он какой-то псевдо-код добавляется в код псевдо

class display(wx.Panel): 
    def __init__(self, *args, **kwargs): 
     super(display, self).__init__(*args, **kwarg) 
     <buttons, sliders, etc> 
     <sizer> 

    def do_some_update(self): 
     <update> 
... 
class selector(wx.Panel): 
    def __init__(self, *args, **kwargs): 
     super(selector, self).__init__(*args, **kwargs) 
     <buttons and stuff> 
     <sizer> 
... 


class mainwindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     super(mainwindow, self).__init__(*args, **kwargs) 
     master_panel = wx.Panel() 
     self.display = display(master_panel) 
     self.selector = selector(master_panel) 

     <sizers and stuff> 

     self.selector.button.Bind(wx.EVT_BUTTON, self.on_button_pressed) 

    def on_button_pressed(self, event): 
     self.display.do_some_update() 

Примечание: Это похоже на некоторые предыдущие вопросы я уже ответил на

wx.Python: Passing control between multiple panels

Passing a tuple between two Panels in wxPython

+0

Было бы важно четко сказать, «кто должен владеть этой логикой»? В этом решении ваша конструкция такова, что вся логика «кто что делает» принадлежит MainWindow - централизованный дизайн и тот, где код в MainWindow должен измениться, если изменяется реализация ребенка. Напротив, решение pubsub предлагает разделение проблем - ребенок, которому нужно иметь дело с событием, становится ответственным за него, а механизм сигнализации отключается от реализации дочернего guis. – GreenAsJade

Смежные вопросы