wxpython是什么_请问wxpython中 event传递的什么参数?
最近搗鼓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传递的什么参数?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: snb处理器hd3000显卡专用extr
- 下一篇: spring environment_S