wxpython event事件_wxPython - 事件处理( Event Handling)

wxPython - 事件处理( Event Handling)

与以顺序方式执行的控制台模式应用程序不同,基于GUI的应用程序是事件驱动的。 执行函数或方法以响应用户的操作,例如单击按钮,从集合中选择项目或鼠标单击等,称为事件。

与应用程序运行时期间发生的事件有关的数据存储为从wx.Event派生的子类的对象。 显示控件(如Button)是特定类型的事件源,并生成与其关联的Event类的对象。 例如,单击按钮会发出wx.CommandEvent。 此事件数据被分派到程序中的事件处理程序方法。 wxPython有许多预定义的事件绑定器。 Event binder封装了特定小部件(控件),其关联的事件类型和事件处理程序方法之间的关系。

例如,要在按钮的单击事件上调用程序的OnClick() method ,需要以下语句 -self.b1.Bind(EVT_BUTTON, OnClick)

Bind() method由来自wx.EvtHandler类的所有显示对象继承。 EVT_.BUTTON这里是绑定器,它将按钮单击事件与OnClick()方法相关联。

例子 (Example)

在下面的示例中,通过拖动顶层窗口(在本例中为wx.Frame对象OnMove() method导致的OnMove() method使用wx.EVT_MOVE绑定器连接到OnMove() method 。 代码显示一个窗口。 如果使用鼠标移动它,它的瞬时坐标将显示在控制台上。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活动和描述

1wxKeyEvent

按下或释放按键时发生

2wxPaintEvent

每当窗口的内容需要重绘时生成

3wxMouseEvent

包含有关鼠标活动(如按下或拖动鼠标按钮)导致的任何事件的数据

4wxScrollEvent

与可滚动控件相关联,如wxScrollbar和wxSlider

5wxCommandEvent

包含源自许多小部件的事件数据,如按钮,对话框,剪贴板等。

6wxMenuEvent

不同的菜单相关事件,不包括菜单命令按钮单击

7wxColourPickerEvent

wxColourPickerCtrl生成的事件

8wxDirFilePickerEvent

FileDialog和DirDialog生成的事件

wxPython中的事件有两种类型。 基本事件和命令事件。 基本事件保持在其发起的窗口的本地。 大多数wxWidgets都会生成命令事件。 command event可以传播到窗口或窗口,窗口或窗口位于类层次结构中的源窗口之上。

例子 (Example)

以下是事件传播的简单示例。 完整的代码是 -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子类和Example,一个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.

wxPython - 主要类( Major Classes)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值