wxPython事件处理

http://www.yiibai.com/wxpython/wxpython_event_handling.html

不像控制台模式应用程序,一个基于GUI的应用程序是事件驱动的,这是在一个顺序的方式执行的。 函数或方法响应于像点击按钮,从集合或鼠标点击等,调用事件选择项目处理函数,用户的操作被执行。

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

例如,要调用一个按钮的点击事件的程序上的 OnClick()方法,下面的语句是必需的-

self.b1.Bind(EVT_BUTTON, OnClick) 

bind()方法是通过从wx.EvtHandler类的所有显示对象继承。EVT_.BUTTON这里是绑定器,其中关联按钮单击事件的 OnClick()方法。

实例

在下面的例子中,MoveEvent事件是由于拖动顶层窗口 – 在这种情况下,一个wx.Frame对象使用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继承子类列于下表中 -

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 以及一个实例,wx.Frame子类是顶层窗口用于程序。一个按钮被放置在面板上。

此按钮对象绑定到的事件处理程序btnclk(),它传播到它的父类(MyPanel在此情况下)。按一下按钮生成可被Skip()方法来传播到其父CommandEvent。

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.
时间: 2024-10-10 00:07:32

wxPython事件处理的相关文章

wxPython:事件处理介绍一

wxPython:事件处理介绍一 事件处理是wxPython程序工作的基本机制,先看几个术语: 事件(event):应该程序期间发生的事情,要求有一个响应. 事件对象(event object):代表具体一个事件,包括事件的数据属性,为wx.Event或其子类的实例,如wx.CommandEvent/wx.MouseEvent. 事件类型(event type):wxPython分配给每个事件对象的一个整数ID. 事件驱动模型: wx.Event的子类: wx.CloseEvent:框架关闭时触

给wxPython事件处理函数传递参数

给wxPython事件处理函数传递参数 2014-04-30 07:47:08segmentfault-博客--点击数:39 最近捣鼓Python,也就自然捣鼓上了wxPython.我曾经用过Qt和Gtk+写GUI,但几乎所有的Python书都告诉我说最好用的是wxPython,我没有尝试PyQt和PyGtk就开始研究wxPython了.在Qt和Gtk+之间我更喜欢Qt,因为它跨平台做得很好,而且商业化也不错.但wxWidget给人的感觉就完全不同了. 如果说wxWidgets相对于Qt有什么优

wxPython事件处理机制

一直没有看明白wxPython的自定义事件是如何工作的.如果要自定义事件,那么需要明白事件源,事件类型,事件处理函数,以及事件绑定器: 但是我在整个过程中没有看到这几个概念是如何关联起来的.下面举例说明一下我的疑问,先看下代码: 1 #!/usr/bin/env python 2 3 #coding=utf-8 4 5 import wx 6 7 class MyTestEvent(wx.PyCommandEvent): #1 定义事件 8 9 def __init__(self, evtTyp

wxPython:事件处理一

事件处理是wxPython程序工作的基本机制,先看几个术语: 事件(event):应该程序期间发生的事情,要求有一个响应. 事件对象(event object):代表具体一个事件,包括事件的数据属性,为wx.Event或其子类的实例,如wx.CommandEvent/wx.MouseEvent. 事件类型(event type):wxPython分配给每个事件对象的一个整数ID wx.Event的子类: wx.CloseEvent:框架关闭时触发,事件类型有普通框架关闭和系统关闭事件. wx.C

wxpython学习资源

http://www.cnblogs.com/dyx1024/archive/2012/07/15/2592202.html wxPython:布局管理器sizer介绍 ogs.com/dyx1024/ date:2012-07-15 ''' import wx import...以本节看一下wxPython中布局管理器sizer的用法,同样,先看一个实例: 代码: #!/usr/bin/env python # -*- coding: utf-8 -*- ''' Function:绘图 soc

[译] 开始使用 wxPython [Getting started with wxPython]

原文:http://wiki.wxpython.org/Getting%20Started 1. 第一个应用程序:Hello World 按照“国际惯例”,我们先写一个“Hello World”的应用程序,下面是代码: 1 #!/usr/bin/env python 2 import wx 3 4 app = wx.App(False) # Create a new app, don't redirect stdout/stderr to a window. 5 frame = wx.Frame

wxPython学习笔记(三)

要理解事件,我们需要知道哪些术语? 事件(event):在你的应用程序期间发生的事情,它要求有一个响应. 事件对象(event object):在wxPython中,它具体代表一个事件,其中包括了事件的数据等属性.它是类wx.Event或其子类的实例,子类如wx.CommandEvent和wx.MouseEvent. 事件类型(event type):wxPython分配给每个事件对象的一个整数ID.事件类型给出了关于该事件本身更多的信息.例如,wx.MouseEvent的事件类型标识了该事件是

wxPython布局管理器(sizer)学习(1)

个人认为学习GUI程序开发,最重要的两个基础点就是:事件处理和界面布局.事件处理能够让你在界面上的控件被鼠标.按键等触发的时候做出合适的响应,比如点击“保存”按钮之后弹出标准的文件保存对话框.另外一件重要的就是界面的布局,之所以要有GUI程序,就是为了有良好的用户体验,如果一个软件界面布局乱七八糟的话,肯定是不合适的.至于按钮.文本框.静态文本这些组件,不过是通过相应的类产生实例并用Add之类的方法添加到面板上而已. wxPython的sizer是用于自动布局一组窗口(之前提到过GUI程序开发中

【Python】 用户图形界面GUI wxpython II

wxpython - 布局和事件 这章主要记录布局器Sizer以及事件的用法. // 目前还需要记录的:Sizer的Add方法加空白,Sizer的Layout,Sizer的Remove如何有效 ■ 布局 之前介绍的所有组件,如果不把它们的pos写死的话,页面上它们会互相重叠,导致没法看.而Sizer就是一个很好的优化布局的工具,通过此可以灵活地管理组件之间的相对位置. Sizer大概的可以被分成GridSizer(网格布局)和BoxSizer(线性布局).Sizer的用法概括起来就是创建Size