wxpython event事件_wxpython 教程 (五): 事件 | wxPython 事件 处理 绑定 | 教程推荐 | 老土译站...

事件是每个 GUI 应用所必须的组成部分,所有的 GUI 应用都是事件驱动的。在应用的生命周期内,需要对各种不同类型的时间做出反应。事件主要来自于应用用户的操作触发,但也可以来源于其他方式:网络连接、窗口管理、定时器等。在应用一开始,我们调用MainLoop()函数,这使得应用开始等待处理所有将生成的事件,直到我们退出程序。本节,我们将讨论 wxPython 事件 相关知识。

事件定义

事件(events)是来源于底层框架如 GUI 工具包的应用层信息。事件循环主要用来分发事件和等待信息。事件分配器将事件匹配到对应的事件处理器,事件处理器即用来对响应事件做出特定反应的函数。

简单的 wxPython 事件 样例

下面我们将描述一个简单的 移动 事件样例。

当我们移动窗口到一个新位置时,会产生一个移动事件,它的类型是 wx.MoveEvent. 该事件的绑定器是 wx.EVT_MOVE。

#!/usr/bin/python

# -*- coding: utf-8 -*-

import wx

class 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((250, 180))

self.SetTitle('Move event')

self.Centre()

self.Show(True)

def OnMove(self, e):

x, y = e.GetPosition()

self.st1.SetLabel(str(x))

self.st2.SetLabel(str(y))

def main():

ex = wx.App()

Example(None)

ex.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()函数的事件参数 e 是一个特定事件类型的对象。这里,e 是 wx.MoveEvent 类的一个实例, 它包含了该 event 的一些信息, 例如包括事件对象和窗口位置等。这里,事件对象即是 wx.Frame 部件。我们可以通过 事件的 GetPosition() 函数来得到当前位置。

图:移动事件

事件绑定

对 wxPython 事件 的处理并不复杂,包括以下三步:

确定 wxPython 事件 绑定器的名字,如  wx.EVT_SIZE、wx.EVT_COLSE 等;

创建一个 wxPython 事件 处理函数,该函数在事件产生时会被调用;

绑定 wxPython 事件 至自定义的事件处理函数。

在 wxPython 中我们称上面的操作为 绑定方法到事件,在其他地方可能将其称为 事件钩子 (hook)。使用 Bind() 方法绑定事件,该方法有以下参数:

Bind(event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY)

参数 event 是 某种EVT_* 对象,它指定了事件的类型。参数 handler 指定了该事件所绑定的处理函数。 当我们想区分来自不同 widgets 的同一类型的时间,可以使用参数 source。当我们有多个 button、菜单项时,可以使用参数 id, 用它来区分不同的组件。当想将一个处理函数绑定至一系列 id 时, 可以使用参数 id2, 比如使用 EVT_MENU_RANGE 的时候。

注意,Bind() 方式在 EvtHandler 类中被定义, wx.Window 就是继承于该类的,而 wx.Winddow 是 wxPython 中大多数 widgets 的基类。Bind() 拥有一个逆操作方法,即 UnBind() 方法。如果想要从一个事件上解除绑定某个事件处理器时,我们可以使用 UnBind() 方法,参数与 Bind() 方法一致。

停止事件

有时,我们需要停止某个事件的继续处理,这时,可以调用 Veto() 方法。

#!/usr/bin/python

# -*- coding: utf-8 -*-

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_CLOSE, self.OnCloseWindow)

self.SetTitle('Event veto')

self.Centre()

self.Show(True)

def OnCloseWindow(self, e):

dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question',

wx.YES_NO | wx.NO_DEFAULT | wx.IC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值