Category 副本攻略

❮ 上一节

下一节 ❯

wxPython - 事件处理

更新于 2024/1/22 13:38:00

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

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

例如,要在按钮的点击事件上调用程序的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()

以上代码产生如下输出 −

current window position x = 562 y = 309

current window position x = 562 y = 309

current window position x = 326 y = 304

current window position x = 384 y = 240

current window position x = 173 y = 408

current window position x = 226 y = 30

current window position x = 481 y = 80

继承自wx.Event的部分子类如下表 −

下面给出了wx.Event最常用的事件

S.N.

事件 & 描述

1

wxKeyEvent

按下或释放按键时发生

2

wxPaintEvent

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

3

wxMouseEvent

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

4

wxScrollEvent

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

5

wxCommandEvent

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

6

wxMenuEvent

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

7

wxColourPickerEvent

wxColourPickerCtrl 生成的事件

8

wxDirFilePickerEvent

FileDialog 和 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 子类和一个 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.

❮ 上一节

下一节 ❯

Copyright © 2088 聚星网游活动中心-最新游戏资讯与福利放送 All Rights Reserved.
友情链接