wxPython - Olay İşleme

Sıralı bir şekilde yürütülen bir konsol modu uygulamasının aksine, GUI tabanlı bir uygulama olay güdümlüdür. İşlevler veya yöntemler, kullanıcının bir düğmeyi tıklatma, koleksiyondan bir öğeyi seçme veya fare tıklaması vb. Gibi olaylara yanıt olarak yürütülür.

Uygulamanın çalışma zamanı sırasında meydana gelen bir olayla ilgili veriler, aşağıdakilerden türetilen bir alt sınıfın nesnesi olarak saklanır. wx.Event. Bir görüntüleme denetimi (Button gibi), belirli bir türdeki olayın kaynağıdır ve kendisiyle ilişkilendirilmiş Event sınıfının bir nesnesini üretir. Örneğin, bir düğmenin tıklanması bir wx.CommandEvent yayınlar. Bu olay verileri, programdaki olay işleyici yöntemine gönderilir. wxPython'da önceden tanımlanmış birçok olay bağlayıcı vardır. BirEvent binder belirli bir pencere öğesi (kontrol), ilişkili olay türü ve olay işleyici yöntemi arasındaki ilişkiyi kapsüller.

Örneğin, aramak için OnClick() method programın bir düğmenin tıklama olayında yer alması durumunda, aşağıdaki ifade gereklidir -

self.b1.Bind(EVT_BUTTON, OnClick)

Bind() methodwx.EvtHandler sınıfındaki tüm görüntüleme nesneleri tarafından miras alınır. EVT_.BUTTON burada, düğme tıklama olayını OnClick () yöntemiyle ilişkilendiren bağlayıcıdır.

Misal

Aşağıdaki örnekte, üst düzey pencerenin (bu durumda bir wx.Frame nesnesi) sürüklenmesinin neden olduğu MoveEvent, OnMove() methodwx.EVT_MOVE bağlayıcı kullanarak. Kod bir pencere görüntüler. Fare kullanılarak hareket ettirilirse, anlık koordinatları konsolda görüntülenir.

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

Yukarıdaki kod aşağıdaki çıktıyı üretir -

geçerli pencere konumu x = 562 y = 309

geçerli pencere konumu x = 562 y = 309

geçerli pencere konumu x = 326 y = 304

geçerli pencere konumu x = 384 y = 240

geçerli pencere konumu x = 173 y = 408

geçerli pencere konumu x = 226 y = 30

geçerli pencere konumu x = 481 y = 80

Wx.Event'ten miras alınan bazı alt sınıflar aşağıdaki tabloda listelenmiştir -

SN Olaylar ve Açıklama
1

wxKeyEvent

Bir tuşa basıldığında veya bırakıldığında oluşur

2

wxPaintEvent

Pencerenin içeriğinin yeniden çizilmesi gerektiğinde oluşturulur

3

wxMouseEvent

Fare düğmesine basılması veya sürüklenmesi gibi fare faaliyetlerinden kaynaklanan herhangi bir olay hakkında veri içerir

4

wxScrollEvent

WxScrollbar ve wxSlider gibi kaydırılabilir kontrollerle ilişkilendirilmiştir

5

wxCommandEvent

Düğme, diyaloglar, pano vb. Gibi birçok widget'tan gelen olay verilerini içerir.

6

wxMenuEvent

Menü komut düğmesi tıklaması hariç farklı menü ile ilgili olaylar

7

wxColourPickerEvent

wxColourPickerCtrl olayları oluşturdu

8

wxDirFilePickerEvent

FileDialog ve DirDialog tarafından oluşturulan etkinlikler

WxPython'daki olaylar iki türdendir. Temel olaylar ve Komut olayları. Temel bir olay, ortaya çıktığı pencerede yerel olarak kalır. WxWidget'ların çoğu komut olayları oluşturur. Bircommand event sınıf hiyerarşisinde kaynak pencerenin üzerinde olan pencere veya pencerelere yayılabilir.

Misal

Aşağıda, olay yayılmasının basit bir örneği verilmiştir. Tam kod -

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

Yukarıdaki kodda iki sınıf vardır. MyPanel, bir wx.Panel alt sınıfı ve Örnek, program için en üst düzey pencere olan bir wx.Frame alt sınıfı. Panele bir düğme yerleştirilir.

Bu Button nesnesi, onu üst sınıfa (bu durumda MyPanel) yayan bir olay işleyicisine btnclk () bağlıdır. Düğme tıklaması birCommandEvent bu, Skip () yöntemiyle üstüne yayılabilir.

MyPanel sınıf nesnesi ayrıca alınan olayı başka bir işleyici OnButtonClicked () 'e bağlar. Bu işlev sırayla kendi ebeveynine, Example sınıfına iletir. Yukarıdaki kod aşağıdaki çıktıyı üretir -

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