鍍金池/ 教程/ Python/ wxPython事件處理
wxPython GUI構(gòu)建工具wxFormBuilder
wxPython StaticText類
WxPython教程
wxPython可停靠窗口
wxPython ComboBox & Choice類
wxPython FlexiGridSizer布局
wxPython入門(Hello World)
wxPython RadioButton & RadioBox類
wxPython拖放
wxPython HTMLWindow類
wxPython ToolBar類
wxPython GridBagSizer布局
wxPython Dialog類
wxPython布局管理
wxPython TextCtrl類
wxPython開發(fā)環(huán)境安裝
wxPython Slider類
wxPython CheckBox類
wxPython Major類
wxPython GridSizer布局
wxPython事件處理
wxPython SplitterWindow類
Menu Item, Menu & MenuBar類
wxPython Button控件
wxPython StaticBoxSizer布局
wxPython Guage類
wxPython Frame類
wxPython多文檔界面
wxPython Panel類
wxPython BoxSizer布局
wxPython繪圖API

wxPython事件處理

不像控制臺(tái)模式應(yīng)用程序,一個(gè)基于GUI的應(yīng)用程序是事件驅(qū)動(dòng)的,這是在一個(gè)順序的方式執(zhí)行的。 函數(shù)或方法響應(yīng)于像點(diǎn)擊按鈕,從集合或鼠標(biāo)點(diǎn)擊等,調(diào)用事件選擇項(xiàng)目處理函數(shù),用戶的操作被執(zhí)行。

有關(guān)某個(gè)事件其中應(yīng)用程序的運(yùn)行時(shí)期間發(fā)生的數(shù)據(jù)被存儲(chǔ)為來自wx.Event衍生的子類的對象。一種顯示控件(例如按鈕)是一種特定類型的事件的源,并且產(chǎn)生與其關(guān)聯(lián)事件類的一個(gè)對象。例如,點(diǎn)擊一個(gè)按鈕發(fā)出 wx.CommandEvent 事件。該事件數(shù)據(jù)被分派到程序事件處理的方法。wxPython中有許多預(yù)定義的事件綁定器。一個(gè)事件綁定封裝了具體的小部件(控件),其關(guān)聯(lián)的事件類型和事件處理方法之間的關(guān)系。

例如,要調(diào)用一個(gè)按鈕的點(diǎn)擊事件的程序上的 OnClick()方法,下面的語句是必需的-
self.b1.Bind(EVT_BUTTON, OnClick) 

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

實(shí)例

在下面的例子中,MoveEvent事件是由于拖動(dòng)頂層窗口 – 在這種情況下,一個(gè)wx.Frame對象使用wx.EVT_MOVE綁定器連接到OnMove()方法。代碼顯示一個(gè)窗口。如果使用鼠標(biāo)移動(dòng),其瞬時(shí)坐標(biāo)顯示在控制臺(tái)上。

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()   
上面的代碼產(chǎn)生下面的輸出 -

Move Event

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

當(dāng)一個(gè)鍵被按下或釋放時(shí)發(fā)生
2

wxPaintEvent

在需要重繪窗口的內(nèi)容時(shí)產(chǎn)生
3

wxMouseEvent

包含有關(guān)事件,由于鼠標(biāo)活動(dòng)數(shù)據(jù),如按下鼠標(biāo)按鈕或拖動(dòng)
4

wxScrollEvent

關(guān)聯(lián)像wxScrollbar和wxSlider滾動(dòng)控制
5

wxCommandEvent

包含事件數(shù)據(jù)來自許多構(gòu)件,如按鈕,對話框,剪貼板等原
6

wxMenuEvent

不同的菜單相關(guān)的事件但不包括菜單命令按鈕點(diǎn)擊
7

wxColourPickerEvent

wxColourPickerCtrl生成的事件
8

wxDirFilePickerEvent

通過FileDialog和DirDialog生成的事件

在wxPython中事件是兩種類型的。基本事件和命令事件。一個(gè)基本的事件停留在它起源的窗口。大多數(shù) wxWidgets生成命令事件。命令事件可以傳播到一個(gè)或多個(gè)窗口,類層次結(jié)構(gòu)來源于窗口上方。

實(shí)例

以下是事件傳播的一個(gè)簡單的例子。完整的代碼是 -
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() 

在上面的代碼中有兩個(gè)類。 MyPanel是一個(gè)子類wx.Panel 以及一個(gè)實(shí)例,wx.Frame子類是頂層窗口用于程序。一個(gè)按鈕被放置在面板上。

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

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

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