Несколько лет назад я увидел пост на вебсайте StackOverflow, который показался мне интересным. Он содержал вопрос: как извлечь имя события из объекта события, такого как EVT_BUTTON, вместо порядкового номера события. Так что я провёл своё маленькое расследование и понял, что в wxPython отсутствуют встроенные инструменты для выполнения этой задачи. Робин Данн, создатель wxPython, посоветовал мне создать словарь событий и их id, чтобы сделать это. Так что, в данной статье, мы рассмотрим то, как реализовать данную возможность.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Я пытался сделать это сам, но предварительно решил убедиться, что никто до меня ещё этого не сделал. После использования гугла, я нашёл форум, в одной из тем которого Робин Данн объяснял, как это сделать. Вот его суть:
1 2 3 4 5 6 7 8 |
import wx eventDict = {} for name in dir(wx): if name.startswith('EVT_'): evt = getattr(wx, name) if isinstance(evt, wx.PyEventBinder): eventDict[evt.typeId] = name |
Данный код работает только с главными событиями. Также существуют особенные события, расположенный в некоторых под-библиотеках в wx, такие как в wx.grid. Вам нужно принять это во внимание. И пока я ещё сам до конца с этим не разобрался, но я могу показать вам как добавить эти грид-события. Давайте взглянем!
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 |
import wx import wx.grid class MyForm(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title="Tutorial") self.eventDict = {} evt_names = [x for x in dir(wx) if x.startswith("EVT_")] for name in evt_names: evt = getattr(wx, name) if isinstance(evt, wx.PyEventBinder): self.eventDict[evt.typeId] = name grid_evt_names = [x for x in dir(wx.grid) if x.startswith("EVT_")] for name in grid_evt_names: evt = getattr(wx.grid, name) if isinstance(evt, wx.PyEventBinder): self.eventDict[evt.typeId] = name panel = wx.Panel(self, wx.ID_ANY) btn = wx.Button(panel, wx.ID_ANY, "Get POS") btn.Bind(wx.EVT_BUTTON, self.onEvent) panel.Bind(wx.EVT_LEFT_DCLICK, self.onEvent) panel.Bind(wx.EVT_RIGHT_DOWN, self.onEvent) def onEvent(self, event): """ Показать какое событие было запущено """ evt_id = event.GetEventType() print(self.eventDict[evt_id]) if __name__ == "__main__": app = wx.App(redirect=True) frame = MyForm().Show() app.MainLoop() |
Как вы могли заметить, мы значительно изменили луп. Мы взяли луп из первого примера и скомбинировали его с первым «IF»-утверждением, чтобы охватить весь список. Это возвращает список имён событий. Затем мы в циклу, используем другие условия, чтобы добавить всё в словарь. Мы сделали это дважды: один раз для обычных событий, и второй раз для событий wx.grid.
Затем мы биндим несколько событий, чтобы проверить наш список событий в wxPython . Если вы запускаете эту программу, вы увидите, что если было запущено хотя бы одно из связанных событий, то его имя будет напечатано в stdout. С тех пор как мы задали, что объект wx.App* является редиректом для stdout, wxPython откроет специальное окно, которое покажет, что будет распечатано. Увидеть, как это выглядит можно на картинке ниже:
Итоги
Теперь вы знаете как получить имя события вместо обычного целого числа. Это может пригодится вовремя дебагинга, когда вы хотите привязать несколько событий к одному хэндлеру, и вам нужно проверить и увидеть какие именно события были запущены. Удачного кодинга!
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»