В отличие от приложения в консольном режиме, которое выполняется последовательно, приложение на основе графического интерфейса пользователя управляется событиями. Функции или методы выполняются в ответ на действия пользователя, такие как нажатие кнопки, выбор элемента из коллекции или щелчок мыши и т. Д., Называемые событиями.
Данные, относящиеся к событию, которое происходит во время выполнения приложения, сохраняются как объект подкласса, производного от wx.Event . Элемент управления отображением (например, Button) является источником события определенного типа и создает связанный с ним объект класса Event. Например, нажатие кнопки генерирует wx.CommandEvent. Эти данные события отправляются методу обработчика события в программе. У wxPython есть много предопределенных связывателей событий. Связыватель событий инкапсулирует отношения между конкретным виджетом (элементом управления), связанным с ним типом события и методом обработчика события.
Например, чтобы вызвать метод OnClick () программы для события нажатия кнопки, требуется следующий оператор:
self.b1.Bind(EVT_BUTTON, OnClick)
Метод Bind () наследуется всеми экранными объектами из класса wx.EvtHandler. EVT_.BUTTON — это механизм связывания, который связывает событие нажатия кнопки с методом OnClick ().
пример
В следующем примере MoveEvent, вызванное перетаскиванием окна верхнего уровня (в данном случае это объект wx.Frame), подключается к методу OnMove () с помощью связывателя wx.EVT_MOVE. Код отображает окно. Если он перемещается с помощью мыши, его мгновенные координаты отображаются на консоли.
import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_MOVE, self.OnMove) self.SetSize((250, 180)) self.SetTitle('Move event') self.Centre() self.Show(True) def OnMove(self, e): x, y = e.GetPosition() print "current window position x = ",x," y= ",y ex = wx.App() Example(None) ex.MainLoop()
Приведенный выше код производит следующий вывод —
текущее положение окна x = 562 y = 309
текущее положение окна x = 562 y = 309
текущее положение окна x = 326 y = 304
текущее положение окна x = 384 y = 240
текущее положение окна x = 173 y = 408
текущее положение окна x = 226 y = 30
текущее положение окна x = 481 y = 80
Некоторые из подклассов, унаследованных от wx.Event, перечислены в следующей таблице:
SN | События и описание |
---|---|
1 |
wxKeyEvent Происходит при нажатии или отпускании клавиши |
2 |
wxPaintEvent Генерируется всякий раз, когда необходимо перерисовать содержимое окна |
3 |
wxMouseEvent Содержит данные о любом событии из-за активности мыши, например нажатие или перетаскивание кнопки мыши |
4 |
wxScrollEvent Связано с элементами прокрутки, такими как wxScrollbar и wxSlider |
5 |
wxCommandEvent Содержит данные о событиях, происходящих из многих виджетов, таких как кнопки, диалоги, буфер обмена и т. Д. |
6 |
wxMenuEvent Различные события, связанные с меню, кроме нажатия кнопки меню |
7 |
wxColourPickerEvent wxColourPickerCtrl сгенерированные события |
8 |
wxDirFilePickerEvent События, сгенерированные FileDialog и DirDialog |
wxKeyEvent
Происходит при нажатии или отпускании клавиши
wxPaintEvent
Генерируется всякий раз, когда необходимо перерисовать содержимое окна
wxMouseEvent
Содержит данные о любом событии из-за активности мыши, например нажатие или перетаскивание кнопки мыши
wxScrollEvent
Связано с элементами прокрутки, такими как wxScrollbar и wxSlider
wxCommandEvent
Содержит данные о событиях, происходящих из многих виджетов, таких как кнопки, диалоги, буфер обмена и т. Д.
wxMenuEvent
Различные события, связанные с меню, кроме нажатия кнопки меню
wxColourPickerEvent
wxColourPickerCtrl сгенерированные события
wxDirFilePickerEvent
События, сгенерированные FileDialog и DirDialog
События в wxPython бывают двух типов. Основные события и командные события. Базовое событие остается локальным по отношению к окну, в котором оно происходит. Большинство wxWidgets генерируют командные события. Событие команды может быть передано в окно или окна, которые находятся выше исходного окна в иерархии классов.
пример
Ниже приведен простой пример распространения событий. Полный код —
import wx class MyPanel(wx.Panel): def __init__(self, parent): super(MyPanel, self).__init__(parent) b = wx.Button(self, label = 'Btn', pos = (100,100)) b.Bind(wx.EVT_BUTTON, self.btnclk) self.Bind(wx.EVT_BUTTON, self.OnButtonClicked) def OnButtonClicked(self, e): print 'Panel received click event. propagated to Frame class' e.Skip() def btnclk(self,e): print "Button received click event. propagated to Panel class" e.Skip() class Example(wx.Frame): def __init__(self,parent): super(Example, self).__init__(parent) self.InitUI() def InitUI(self): mpnl = MyPanel(self) self.Bind(wx.EVT_BUTTON, self.OnButtonClicked) self.SetTitle('Event propagation demo') self.Centre() self.Show(True) def OnButtonClicked(self, e): print 'click event received by frame class' e.Skip() ex = wx.App() Example(None) ex.MainLoop()
В приведенном выше коде есть два класса. MyPanel , подкласс wx.Panel и Example, подкласс wx.Frame, который является окном верхнего уровня для программы. Кнопка находится на панели.
Этот объект Button связан с обработчиком событий btnclk (), который передает его в родительский класс (в данном случае MyPanel). Нажатие кнопки генерирует CommandEvent, который может быть передан его родителю методом Skip ().
Объект класса MyPanel также связывает полученное событие с другим обработчиком OnButtonClicked (). Эта функция, в свою очередь, передает своему родителю класс Example. Приведенный выше код производит следующий вывод —