wxPython事件處理

不像控制檯模式應用程序,一個基於GUI的應用程序是事件驅動的,這是在一個順序的方式執行的。 函數或方法響應於像點擊按鈕,從集合或鼠標點擊等,調用事件選擇項目處理函數,用戶的操作被執行。

有關某個事件其中應用程序的運行時期間發生的數據被存儲爲來自wx.Event衍生的子類的對象。一種顯示控件(例如按鈕)是一種特定類型的事件的源,並且產生與其關聯事件類的一個對象。例如,點擊一個按鈕發出 wx.CommandEvent 事件。該事件數據被分派到程序事件處理的方法。wxPython中有許多預定義的事件綁定器。一個事件綁定封裝了具體的小部件(控件),其關聯的事件類型和事件處理方法之間的關係。

例如,要調用一個按鈕的點擊事件的程序上的 OnClick()方法,下面的語句是必需的-

self.b1.Bind(EVT_BUTTON, OnClick) 

bind()方法是通過從wx.EvtHandler類的所有顯示對象繼承。EVT_.BUTTON這裏是綁定器,其中關聯按鈕單擊事件的 OnClick()方法。

實例

在下面的例子中,MoveEvent事件是由於拖動頂層窗口 – 在這種情況下,一個wx.Frame對象使用wx.EVT_MOVE綁定器連接到OnMove()方法。代碼顯示一個窗口。如果使用鼠標移動,其瞬時座標顯示在控制檯上。

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

上面的代碼產生下面的輸出 -
wxPython事件處理

current window position x = 562 y = 309

current window position x = 562 y = 309

current window position x = 326 y = 304

current window position x = 384 y = 240

current window position x = 173 y = 408

current window position x = 226 y = 30

current window position x = 481 y = 80

一些來自wx.Event繼承子類列於下表中 -

S.N.

事件和說明

1

wxKeyEvent

當一個鍵被按下或釋放時發生

2

wxPaintEvent

在需要重繪窗口的內容時產生

3

wxMouseEvent

包含有關事件,由於鼠標活動數據,如按下鼠標按鈕或拖動

4

wxScrollEvent

關聯像wxScrollbar和wxSlider滾動控制

5

wxCommandEvent

包含事件數據來自許多構件,如按鈕,對話框,剪貼板等原

6

wxMenuEvent

不同的菜單相關的事件但不包括菜單命令按鈕點擊

7

wxColourPickerEvent

wxColourPickerCtrl生成的事件

8

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 以及一個實例,wx.Frame子類是頂層窗口用於程序。一個按鈕被放置在面板上。

此按鈕對象綁定到的事件處理程序btnclk(),它傳播到它的父類(MyPanel在此情況下)。按一下按鈕生成可被Skip()方法來傳播到其父CommandEvent。

MyPanel類對象也綁定所接收的事件到另一個處理方法OnButtonClicked()。反過來此函數傳送到其父,Example類。上面的代碼產生下面的輸出−
wxPython事件處理

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