wxPython - obsługa zdarzeń

W przeciwieństwie do aplikacji w trybie konsoli, która jest wykonywana w sposób sekwencyjny, aplikacja oparta na graficznym interfejsie użytkownika jest sterowana zdarzeniami. Funkcje lub metody są wykonywane w odpowiedzi na działania użytkownika, takie jak kliknięcie przycisku, wybranie elementu z kolekcji lub kliknięcie myszą itp., Zwane zdarzeniami.

Dane dotyczące zdarzenia, które ma miejsce podczas działania aplikacji, są przechowywane jako obiekt podklasy pochodzącej z wx.Event. Kontrolka wyświetlania (taka jak Button) jest źródłem zdarzenia określonego typu i tworzy obiekt klasy Event skojarzonej z nią. Na przykład kliknięcie przycisku powoduje wyświetlenie zdarzenia wx.CommandEvent. Te dane zdarzenia są wysyłane do metody obsługi zdarzeń w programie. wxPython ma wiele predefiniowanych powiązań zdarzeń. NaEvent binder hermetyzuje relację między określonym widgetem (kontrolką), skojarzonym z nim typem zdarzenia i metodą obsługi zdarzenia.

Na przykład, żeby zadzwonić OnClick() method programu po kliknięciu przycisku, wymagane jest następujące oświadczenie -

self.b1.Bind(EVT_BUTTON, OnClick)

Bind() methodjest dziedziczona przez wszystkie obiekty wyświetlane z klasy wx.EvtHandler. EVT_.BUTTON to binder, który kojarzy zdarzenie kliknięcia przycisku z metodą OnClick ().

Przykład

W poniższym przykładzie MoveEvent, spowodowane przeciągnięciem okna najwyższego poziomu - w tym przypadku obiektu wx.Frame - jest połączone z OnMove() methodza pomocą segregatora wx.EVT_MOVE. Kod wyświetla okno. Jeśli zostanie przesunięty za pomocą myszy, jego chwilowe współrzędne są wyświetlane na konsoli.

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()

Powyższy kod daje następujące dane wyjściowe -

aktualna pozycja okna x = 562 y = 309

aktualna pozycja okna x = 562 y = 309

aktualna pozycja okna x = 326 y = 304

aktualna pozycja okna x = 384 y = 240

aktualna pozycja okna x = 173 y = 408

aktualna pozycja okna x = 226 y = 30

aktualna pozycja okna x = 481 y = 80

Niektóre podklasy dziedziczone po wx.Event są wymienione w poniższej tabeli -

SN Wydarzenia i opis
1

wxKeyEvent

Występuje, gdy klawisz zostanie naciśnięty lub zwolniony

2

wxPaintEvent

Jest generowany za każdym razem, gdy zawartość okna wymaga ponownego narysowania

3

wxMouseEvent

Zawiera dane o dowolnym zdarzeniu spowodowanym aktywnością myszy, taką jak naciśnięcie lub przeciągnięcie przycisku myszy

4

wxScrollEvent

Skojarzone z przewijalnymi kontrolkami, takimi jak wxScrollbar i wxSlider

5

wxCommandEvent

Zawiera dane o zdarzeniach pochodzące z wielu widżetów, takich jak przyciski, okna dialogowe, schowek itp.

6

wxMenuEvent

Różne zdarzenia związane z menu, z wyjątkiem kliknięcia przycisku polecenia menu

7

wxColourPickerEvent

Zdarzenia wygenerowane przez wxColourPickerCtrl

8

wxDirFilePickerEvent

Zdarzenia generowane przez FileDialog i DirDialog

Zdarzenia w wxPython są dwojakiego rodzaju. Podstawowe wydarzenia i zdarzenia dowodzenia. Podstawowe zdarzenie pozostaje lokalne dla okna, z którego pochodzi. Większość wxWidgets generuje zdarzenia poleceń. ZAcommand event mogą być propagowane do okna lub okien, które znajdują się nad oknem źródłowym w hierarchii klas.

Przykład

Poniżej znajduje się prosty przykład propagacji zdarzeń. Kompletny kod to -

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()

W powyższym kodzie są dwie klasy. MyPanel, podklasę wx.Panel i Example, podklasę wx.Frame, która jest oknem najwyższego poziomu programu. W panelu umieszczony jest przycisk.

Ten obiekt Button jest powiązany z programem obsługi zdarzeń btnclk (), który propaguje go do klasy nadrzędnej (w tym przypadku MyPanel). Kliknięcie przycisku generujeCommandEvent który można propagować do swojego rodzica metodą Skip ().

Obiekt klasy MyPanel wiąże również odebrane zdarzenie z innym programem obsługi OnButtonClicked (). Ta funkcja z kolei przekazuje do swojej nadrzędnej klasy Example. Powyższy kod daje następujące dane wyjściowe -

Button received click event. Propagated to Panel class. 
Panel received click event. Propagated to Frame class. 
Click event received by frame class.