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.