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()   
上面的程式碼產生下面的輸出 -

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類。上面的程式碼產生下面的輸出?

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