В прошлой статье про Pubsub мы рассмотрели, как использовать встроенную в wxPython версию Pubsub для того, чтобы отправлять сообщения внутри приложения. Сегодня же мы научимся альтернативному методу, который называется PyDispatcher. Он ведёт себя также, как и модуль Pubsub. Давайте разберёмся!
Приступаем к работе
Прежде всего вам нужно скачать PyDispatcher и установить его на вашу систему. Если у вас установлен pip, вы можете ввести следующую команду:
1 |
pip install PyDispatcher |
В обратном случае, перейдите на страницу продукта в интернете и скачайте его оттуда. Одним из преимуществ Pubsub является то, что он уже включён в стандартный дистрибутив wxPython. Как бы то ни было, если вы хотите использовать Pubsub ОТДЕЛЬНО от wxPython, вам нужно будет скачать его самостоятельную базу кода и установить её. Среди программистов много тех, кто не хочет загружать больше дополнительных элементов, чем им нужно.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
В любом случае, теперь у нас есть PyDispatcher, так что давайте импортируем код из Pubsub и посмотрим, что из этого выйдет!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import wx from pydispatch import dispatcher class OtherFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, wx.ID_ANY, "Secondary Frame") panel = wx.Panel(self) msg = "Enter a Message to send to the main frame" instructions = wx.StaticText(panel, label=msg) self.msgTxt = wx.TextCtrl(panel, value="") closeBtn = wx.Button(panel, label="Send and Close") closeBtn.Bind(wx.EVT_BUTTON, self.onSendAndClose) sizer = wx.BoxSizer(wx.VERTICAL) flags = wx.ALL|wx.CENTER sizer.Add(instructions, 0, flags, 5) sizer.Add(self.msgTxt, 0, flags, 5) sizer.Add(closeBtn, 0, flags, 5) panel.SetSizer(sizer) def onSendAndClose(self, event): """ Отправить сообщение и закрыть фрейм """ msg = self.msgTxt.GetValue() dispatcher.send("panelListener", message=msg) dispatcher.send("panelListener", message="test2", arg2="2nd argument!") self.Close() class MyPanel(wx.Panel): """""" def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) dispatcher.connect(self.myListener, signal="panelListener", sender=dispatcher.Any) btn = wx.Button(self, label="Open Frame") btn.Bind(wx.EVT_BUTTON, self.onOpenFrame) def myListener(self, message, arg2=None): """ Функция слушателя """ print("Received the following message: " + message) if arg2: print("Received another arguments: " + str(arg2)) def onOpenFrame(self, event): """ Открыть вторичный фрейм """ frame = OtherFrame() frame.Show() class MyFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="PyDispatcher Tutorial") panel = MyPanel(self) self.Show() if __name__ == "__main__": app = wx.App(False) frame = MyFrame() app.MainLoop() |
Давайте сделаем небольшой перерыв. Сначала мы импортируем dispatcher из пакета pydispatch. Затем мы редактируем метод onSendAndClose для OtherFrame, таким образом, чтобы он отправлял ваши сообщения панельным слушателям. Вот первый фрагмент, который нам нужно изменить:
1 2 3 4 5 6 7 8 |
def onSendAndClose(self, event): """ Отправить сообщение и закрыть фрейм """ msg = self.msgTxt.GetValue() dispatcher.send("panelListener", message=msg) dispatcher.send("panelListener", message="test2", arg2="2nd argument!") self.Close() |
Теперь нам нужно изменить класс MyPanel, чтобы установить нового слушателя:
1 2 3 |
dispatcher.connect( self.myListener, signal="panelListener", sender=dispatcher.Any ) |
Этот код сообщает pydispatcher слушать любого отправителя, у которого есть сигнал от panelListener. Если у него есть этот сигнал, тогда он вызовет панель метода myListener. Это было довольно простое изменение.
ИТОГИ
Как я уже упоминал в начале статьи, пакет PyDispatcher в wxPython следует той же идее, что и пакет PubSub, но, с точки зрения кода, исполняет её немного по-другому. Лично я предпочитаю Pubsub, так как его версия встроена в wxPython, так что мне не нужно устанавливать никаких дополнений. Как бы то ни было, вам стоит взглянуть на оба API, чтобы понять какой из них будет оптимально подходить под ваш стиль программирования. Иногда лучшее API стоит установки дополнительных приложений.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»