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.