wxPython中的事件
事件是每个GUI应用程序不可缺少的一部分。所有GUI应用程序都是事件驱动的。一个应用程序对在其生命周期中产生的不同事件类型做出反应。事件主要由应用程序的用户产生。但它们也可以通过其他方式产生,例如互联网连接、窗口管理器或定时器。所以当我们调用MainLoop()方法时,我们的应用程序会等待事件的产生。当我们退出应用程序时,MainLoop()方法就结束了。
定义
事件是来自底层框架的一段应用级信息,通常是GUI工具包。事件循环是一种编程结构,它在程序中等待并派发事件或消息。事件循环反复寻找要处理的事件。派遣器是一个将事件映射到事件处理程序的过程。事件处理程序是对事件做出反应的方法。
事件对象是与事件相关联的对象。它通常是一个窗口。事件类型是一个已经生成的唯一事件。事件绑定器是将事件类型与事件处理程序绑定的对象。
wxPython wx.EVT_MOVE 例子
在下面的例子中,我们对wx.MoveEvent事件做出反应。当我们将一个窗口移动到一个新的位置时,就会产生这个事件。这个事件是wx.EVT_MOVE。
#evt_move.pyimport wxclass Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): wx.StaticText(self, label='x:', pos=(10,10)) wx.StaticText(self, label='y:', pos=(10,30)) self.st1 = wx.StaticText(self, label='', pos=(30, 10)) self.st2 = wx.StaticText(self, label='', pos=(30, 30)) self.Bind(wx.EVT_MOVE, self.OnMove) self.SetSize((350, 250)) self.SetTitle('Move event') self.Centre() def OnMove(self, e): x, y = e.GetPosition() self.st1.SetLabel(str(x)) self.st2.SetLabel(str(y))def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop()if __name__ == '__main__': main()
该示例显示窗口的当前位置。
self.Bind(wx.EVT_MOVE, self.OnMove)
这里我们将wx.EVT_MOVE
事件绑定到OnMove()
方法。
def OnMove(self, e): x, y = e.GetPosition() self.st1.SetLabel(str(x)) self.st2.SetLabel(str(y))
OnMove()方法中的事件参数是一个特定事件类型的对象。在我们的例子中,它是一个wx.MoveEvent类的实例。这个对象保存了有关事件的信息,例如事件对象或窗口的位置。在我们的例子中,事件对象是 wx.Frame 组件。我们可以通过调用事件的GetPosition()方法找出当前位置。
wxPython 事件binding
wxPython中处理事件的三个步骤是。
- 确定事件binder名称:
wx.EVT_SIZE
,wx.EVT_CLOSE
等。 - 创建一个事件处理程序。当一个事件生成时,该方法被调用。
- 将一个事件绑定到一个事件处理程序。
在wxPython中,我们说要把一个方法绑定到一个事件上。有时会使用hook这个词。你可以通过调用Bind()
方法来绑定一个事件。该方法有以下参数。
Bind(event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY)
event
是EVT_*对象之一。它指定了事件的类型。handler
是一个要被调用的对象,换句话说,它是一个与事件绑定的方法。source
参数用于当我们想区分不同小组件的同一事件类型时。id
参数用于我们有多个按钮、菜单项等时。id
参数用于区分它们。id2
用于当需要将一个处理程序绑定到一系列id时,例如EVT_MENU_RANGE
。
请注意,方法Bind()
定义在类EvtHandler
中。它是一个继承自wx.Window
的类。wx.Window
是wxPython中大多数组件的基类。还有一个反向过程。如果我们想从一个事件中解绑一个方法,我们调用Unbind()
方法。它的参数和上面的方法一样。
Vetoing events(否决事件)
有时我们需要停止处理一个事件。为此,我们调用Veto()<