首页 > 代码库 > wxPython事件处理

wxPython事件处理

http://www.yiibai.com/wxpython/wxpython_event_handling.html

不像控制台模式应用程序,一个基于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.

wxPython事件处理