Учебники

wxPython — обработка событий

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

Данные, относящиеся к событию, которое происходит во время выполнения приложения, сохраняются как объект подкласса, производного от 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. Приведенный выше код производит следующий вывод —

Вывод обработки события