wxPython 事件处理
与以顺序方式执行的控制台模式应用程序不同,基于GUI的应用程序是事件驱动的。函数或方法响应用户的操作来执行,例如单击按钮,从集合或鼠标单击等中选择一个项目,称为事件。
有关在应用程序运行时发生的事件的数据存储为从 wx.Event 派生的子类的对象。显示控件(如Button)是特定类型的事件源,并生成与其关联的Event类的对象。例如,点击一个按钮会发出一个wx.CommandEvent。该事件数据被分派到程序中的事件处理程序方法。wxPython有许多预定义的事件绑定器。一个 事件粘合剂 封装了特定微件(对照),其相关联的事件类型和事件处理方法之间的关系。
例如,要在按钮的单击事件中调用该程序的 OnClick()方法 ,以下语句是必需的 -
self.b1.Bind(EVT_BUTTON, OnClick)
Bind()方法 由wx.EvtHandler类中的所有显示对象继承。这里的EVT_.BUTTON是活页夹,它将按钮点击事件关联到OnClick()方法。
范例
在以下示例中,通过拖动顶层窗口(本例中为wx.Frame对象 ) 导致的 MoveEvent 使用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()
上面的代码产生以下输出 -
当前窗口位置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 | 活动和说明 |
---|---|
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生成命令事件。甲 命令事件 可以传播到窗口或窗口,这是在类层次结构的源窗口上方。
范例
以下是事件传播的一个简单示例。完整的代码是:
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子类,它是该程序的顶级窗口。一个按钮放置在面板上。
这个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.
GUI小部件可以通过指定以像素为单位测量的绝对坐标放置在容器窗口内。坐标是相对于由其构造函数的size参数定义的窗口的尺寸。窗口内的窗口部件的位置由其构造函数的 pos 参数定义。import wx app = ...