与以顺序方式执行的控制台模式应用程序不同,基于GUI的应用程序是事件驱动的。响应于用户的操作(如单击按钮,从集合或鼠标点击中选择一个项目等)来执行函数或方法,称为事件。
与在应用程序运行时发生的事件相关的数据被存储为从wx.Event派生的子类的对象。显示控件(如Button)是特定类型的事件源,并产生与其关联的Event类的对象。例如,点击一个按钮会发出一个wx.CommandEvent。该事件数据被分派到程序中的事件处理程序方法。wxPython有许多预定义的事件绑定。一个事件粘合剂封装了特定微件(对照),其相关联的事件类型和事件处理方法之间的关系。
例如,要在按钮的click事件上调用程序的OnClick()方法,需要以下语句 -
self.b1.Bind(EVT_BUTTON, OnClick)
Bind()方法由wx.EvtHandler类中的所有显示对象继承。EVT_.BUTTON这里是将按钮点击事件关联到OnClick()方法的活页夹。
例
在以下示例中,通过拖动顶级窗口(在这种情况下为wx.Frame对象)引起的MoveEvent使用wx.EVT_MOVE绑定器连接到OnMove()方法。代码显示一个窗口。如果使用鼠标移动,其瞬时坐标将显示在控制台上。
importwxclassExample(wx.Frame):def__init__(self,*args,**kw):super(Example,self).__init__(*args,**kw)self.InitUI()defInitUI(self):self.Bind(wx.EVT_MOVE,self.OnMove)self.SetSize((250,180))self.SetTitle("Move event")self.Centre()self.Show(True)defOnMove(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
当前窗口位置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继承的一些子类列在下表中:
以下是wx.Event最常用的事件
SN
Events & Description
1
wxKeyEvent
Occurs when a key is presses or released
2
wxPaintEvent
Is generated whenever contents of the window needs to be redrawn
3
wxMouseEvent
Contains data about any event due to mouse activity like mouse button pressed or dragged
4
wxScrollEvent
Associated with scrollable controls like wxScrollbar and wxSlider
5
wxCommandEvent
Contains event data originating from many widgets such as button, dialogs, clipboard, etc.
6
wxMenuEvent
Different menu-related events excluding menu command button click
7
wxColourPickerEvent
wxColourPickerCtrl generated events
8
wxDirFilePickerEvent
Events generated by FileDialog and DirDialog
wxPython中的事件有两种类型。基本事件和命令事件。一个基本的事件保留在它发生的窗口的本地。大多数wxWidgets生成命令事件。甲命令事件可以传播到窗口或窗口,这是在类层次结构的源窗口上方。
例
以下是事件传播的简单示例。完整的代码是 -
importwxclassMyPanel(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)defOnButtonClicked(self,e):print"Panel received click event. propagated to Frame class"e.Skip()defbtnclk(self,e):print"Button received click event. propagated to Panel class"e.Skip()classExample(wx.Frame):def__init__(self,parent):super(Example,self).__init__(parent)self.InitUI()defInitUI(self):mpnl=MyPanel(self)self.Bind(wx.EVT_BUTTON,self.OnButtonClicked)self.SetTitle("Event propagation demo")self.Centre()self.Show(True)defOnButtonClicked(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其可以通过跳过()方法被传播到它的父。
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.