开发手册 欢迎您!
软件开发者资料库

wxPython - 事件处理

wxPython事件处理 - 从简介,环境,Hello World,wx.Frame类,wx.Panel类,GUI生成器工具,主要类,事件处理,布局管理,BoxSizer,GridSizer,FlexiGridSizer,GridBagSizer,StaticBoxSizer,按钮,开始学习wxPython StaticText类,TextCtrl类,RadioButton和RadioBox,CheckBox类,ComboBox和Choice类,Gauge类,滑块类,菜单项,Menu和MenuBar,ToolBar类,Dialog类,NoteBook类,Dockable Windows,多文档接口,SplitterWindow类,绘图API,HTMLWindow类,ListBox和ListCtrl类,拖放。

与以顺序方式执行的控制台模式应用程序不同,基于GUI的应用程序是事件驱动的.执行函数或方法以响应用户的操作,如单击按钮,从集合中选择项目或鼠标单击等,称为事件.

与事件发生期间发生的事件有关的数据应用程序的运行时存储为从 wx.Event 派生的子类的对象.显示控件(如Button)是特定类型事件的来源,并生成与其关联的Event类的对象.例如,单击按钮会发出wx.CommandEvent.此事件数据被分派到程序中的事件处理程序方法. wxPython有许多预定义的事件绑定器. 事件绑定器封装了特定小部件(控件),其关联事件类型和事件处理程序方法之间的关系.

例如,要调用 OnClick按钮的click事件上的程序的<)方法,以下语句是必需的 :

  self.b1.Bind( EVT_BUTTON,OnClick)

Bind()方法由wx.EvtHandler类的所有显示对象继承. EVT_.BUTTON这里是绑定器,它将按钮单击事件与OnClick()方法相关联.

示例

在以下示例中,MoveEvent,通过拖动顶级窗口(在这种情况下为wx.Frame对象)连接到 OnMove()方法,使用wx.EVT_MOVE绑定器.代码显示一个窗口.如果使用鼠标移动它,它的瞬时坐标将显示在控制台上.

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

以上代码产生以下输出 :

移动事件

当前窗口位置x = 562 y = 309

当前w ^ indow位置x = 562 y = 309

当前窗口位置x = 326 y = 304

当前窗口位置x = 384 y = 240

当前窗口位置x = 173 y = 408

当前窗口位置x = 226 y = 30

当前窗口位置x = 481 y = 80

从wx.Event继承的一些子类列在下表中 :

SN活动&说明
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子类和Example,一个wx.Frame子类,它是程序的顶级窗口.按钮放在面板中.

此Button对象绑定到事件处理程序btnclk(),它将它传播到父类(在本例中为MyPanel).按钮单击生成 CommandEvent ,可以通过Skip()方法传播到其父级.

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.