最近捣鼓Python,也就自然捣鼓上了wxPython。我曾经用过Qt和Gtk+写GUI,但几乎所有的Python书都告诉我说最好用的是wxPython,我没有尝试PyQt和PyGtk就开始研究wxPython了。在Qt和Gtk+之间我更喜欢Qt,因为它跨平台做得很好,而且商业化也不错。但wxWidget给人的感觉就完全不同了。

如果说wxWidgets相对于Qt有什么优势的话,大概就只有体积较小了。从开发效率上看,如果不和Python组合真的比不上Qt;从商业支持上看wxWidgets根本没有。不过和Python组合之后,开发效率大大提高,虽然用来做很正式的商业软件并不合适,但写写小程序还是很方便的。

现在切入正题,wxWidgets是一个事件驱动的体系,对于触发的事件,需要给它挂上相应的事件处理函数。在Python中这个函数的形式是这样的:

wx.Frame.Bind(self, event, handler, source=None, id=-1, id2=-1)

在一般使用时,我们基本上只会给定event、handler和source,event是事件的名称,handler是处理函数,source是事件的发生者,比如一个Button1被单击而发生了EVT_BUTTON事件,如果我们用self.OnButton1()来处理,会这么写:

self.Bind(wx.EVT_BUTTON, self.OnButton1, self.Button1)

这里self是一个Frame(wxPython中的窗体这样的东西),而Button1是放在这个Frame下面的一个Button,self.OnButton1就是事件处理函数。而wxPython定死了事件处理函数的形式:

def handler(self,event):...

事件处理函数只能接受两个参数,一个还是self。至于event,一看就知道是那个发生的事件。但这样就有一个问题了:如果我想批量创建一些按钮或者菜单键(我想这种事情是很普遍的),并且希望用同一个函数来处理它们,这个函数该怎样辨别是哪个按钮触发的事件呢?显然我们希望能多传一些参数。Qt实现这一点很容易,但wxWidgets就显得很棘手了。

我并没有用C++写过wxWidgets的程序——确切地讲是复制过一个example的,但是不知道是我英语太拆还是真的没有,我没能在wxWidgets的入门指南中找到编译指令,最后没法编译它。因此我不知道这个限制是不是C++也有,但是Python可以通过lambda来解决这个问题。以下的例子我用的是菜单。

首先我们建一个OnMenusClick函数:

def OnMenusClick(self, event, mark):....

这个函数多接收一个mark,绑定的时候,就不是把OnMenusClick直接绑定上去,而是传递一个被lambda包装过的函数。下面这个例子就会建立一堆Menu的按键,并给他们编号,OnMenusClick就可以接收到它们的编号了:

menu=wx.Menu()for i in range(0,N):btn=menu.Append(wx.NewId(), str(i))self.Bind(wx.EVT_MENU, lambda evt, mark=i : self.OnMenusClick(evt,mark) ,btn )

完成了!是不是感觉有点magic?关键在于这句lambda

lambda evt, mark=i : self.OnMenusClick(evt,mark)

这句实际上产生了只接收evt一个参数的函数,并将其传递给了self.OnMenusClick,这样就能够实现给事件处理函数传递更多参数的目的了。

def OnClick(evt,agrv):

print agrv

print evt

def func(evt,function):

function(evt)

func(2,lambda evt,argv=4:OnClick(evt,argv))

#!/usr/bin/env python

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

__author__ = 't'

import time

""" 过了某段时间案就执行 callback

"""

def func(t, callback, arg):

time.sleep(t)

callback(arg)

def test(name,other):

print "my name is %s" %name

print other

print "well done!"

# now, I want to pass some params to callback, how?

func(2,lambda name,other="asdf":test(name,other),"nihao")

wxpython是什么_请问wxpython中 event传递的什么参数?相关推荐

  1. java 中文参数_关于JAVA中URL传递中文参数的问题

    今天在调用一个接口时,需要传递一个中文参数,结果获取不到数据,原因就在于中文传参的编码问题. 问题来源:URL url= new URL("http://XXX?OrganName=司法厅& ...

  2. 【学习笔记】MyBatis中接口中方法传递多个参数问题展示与解决

    问题展示 编写Mapper接口 public interface ProductsDao {public Products findById(int i);public void deleteById ...

  3. wxpython收费吗_使用wxPython开发一个简单GUI应用

    python用的时间不长,一般用来做字符串处理.简单测试的一些小程序.最近工作中需要做一个简单的GUI应用,使用麦克录音并存成wave文件.然后就想拿wxPython练练手. 一.概述 GUI开发采用 ...

  4. wxpython播放视频_使用wxpython显示网络摄像头视频闪烁

    我是python的新手.我正在尝试编写一个运动检测应用程序.目前,我正在尝试将网络摄像头视频显示在屏幕上.当前的代码现在没有闪烁,但在任何调整大小后,闪烁将会回来.任何线索?另外,为什么没有self. ...

  5. wxpython 右键菜单_使用wxPython打造印象笔记(14)笔记本管理

    上一篇文章中,我们用peewee对数据库建模并创建了数据库,然后成功的加载了默认笔记本.这篇文章将完成笔记本的管理功能,分为创建笔记本,修改笔记本,删除笔记本这三个功能.创建笔记本编辑笔记本删除笔记本 ...

  6. python中 什么意思_请问python中%代表什么意思?

    婷婷同学_ 1.格式符例如:a = 'test'print 'it is a %s' %(a)打印的结果就是 it is a test2.单独看%,是一个运算符号,求余数.例如:求模运算,相当于mod ...

  7. divgrad怎么求_请问高等数学中div(grad u)中的div是什么意思?

    DIV,即散度(divergence). 其运算公式为: 设某量场由 A(x,y,z) = P(x,y,z)i + Q(x.y,z)j + R(x,y,z)k 给出,其中 P.Q.R 具有一阶连续偏导 ...

  8. mysql 正序_请问mysql 中 怎么实现这种排序,按照状态排序正序,再按照开始时间排序正序,...

    展开全部 有两个思路 1.按照各自的活动状态先排序,插入到临时表,最后再union all所有结32313133353236313431303231363533e58685e5aeb931333363 ...

  9. wxpython应用程序_用wxPython创建GUI应用程序展示NASA图片(第一部分)

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在成长过程中,我时常认为探索宇宙空间是一件令人兴奋的事情,幻想那些未知的事物是相当有趣的.我也喜欢浏览异世 ...

最新文章

  1. jquery 设置asp:dropdownlist 选中项
  2. 设计模式常见面试真题详解
  3. 视频 | 为何我对小鹏NGP“半信半疑”
  4. linux下虚拟光驱,求助:谁有Linux下的虚拟光驱软件?
  5. Lock-Free / Lockless 相关术语
  6. Java笔记:final修饰符
  7. linux动态时钟探索
  8. qq刷屏代码可复制_QQ小程序「神奇字体」从注册到发布
  9. WES7 定制界面完整过程(去除所有windows标识)
  10. 求一堆点中的最大点集合(边界点)
  11. [FAQ06649] Latin输入法怎么默认勾选几种语言?
  12. UML for mac
  13. 【Solidity】7. 部件 - 深入理解Solidity
  14. 轻松摆好人像摄影姿势
  15. Python使用Plot库构图--详细教程
  16. 设置Sysctl conf用以提高Linux的性能 最完整的sysctl conf优化方案
  17. 算法题/青蛙跳台阶问题
  18. Android的WiFi子系统架构
  19. 5G+AI数字化智能工厂建设解决方案
  20. 螺旋打印二维数组(字节三面)

热门文章

  1. postman 400 bad request 原因_盐城400电话
  2. vc2010中设置ipch与sdf的位置
  3. WebBrowser 操作(从网上收集)
  4. u-boot命令寻找分析--find_cmd函数
  5. Java数组的基本知识点
  6. 收藏一个有趣的帖子,现在的客户端真有点让人不安,难怪XSS。。。
  7. pat天梯赛L1-051. 打折
  8. Bit-Z全球生态联盟暨韩国战略发布会即将开启
  9. 如何让区块链连接外面的世界
  10. 【David Silver强化学习公开课】-5:Model-Free Control