一、認識事件
上次我們講完了wx中的Panel面板,今天我們就來說一說關於事件。事件就是指在當前frame窗口中由用戶與機器交互時人爲產生的要求機器捕獲並處理的動作,統稱爲事件,而機器捕獲到事件稱爲捕獲事件,機器捕獲後對其執行稱爲響應事件,從捕獲到響應這段時間稱爲響應時間,響應事件後要執行一些動作,通常爲調用函數來實現反應用戶的操作。事件通常可以是一個按鈕被按下、鼠標移動、鍵盤按鍵捕獲。wxPython可以處理的事件很多,這裏不再過多敘述,大家可以另行了解,或查閱wxPython幫助文件。
事件處理的過程涉及4個要素:
- 事件。 它是用戶對界面操作,在wxPython中事件被封裝成事件類wx.Event及其子類,例如按鈕事件類wx.CommandEvent。
- 事件類型。 事件類型給出了更多地信息,它是一個整數
- 事件源。 它是事件發生的場所,就是各個控件,例如按鈕事件的事件源是按鈕
- 事件處理者。 它是在wx.EvtHeadler子類(事件處理類)中定義的一個方法
認識了事件,我們下面來看看語法。
二、綁定事件
綁定事件,顧名思義,就是將控件和執行的方法關聯在一起。那麼如何綁定呢?就用wx提供的Bind函數來綁定就行了。話不多說,先上語法:
Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY)
事件綁定後,單擊綁定的控件,就可以執行相應的方法。
下面來講講Bind方法的參數:
1.self參數:指的是誰來綁定,self是自動傳參,形參時寫上,實參時不用,由於非常簡單,這個不講。
2.event參數:這裏有一個易錯點,注意參數event是一個事件類型,不是事件。
3.handler參數:指定處理函數,注意只寫名稱不帶括號。
4.source參數:事件源,可省略,用id來指定控件。
5.id參數:該參數指定控件id,只能寫一個。
6.id2參數:用於和id參數搭配指定範圍,如id=1,id2=10是指id是1~10的控件都綁定到handler方法中。
下面,我們就分幾種情況來認識一下事件處理。
三、事件處理
我們的事件處理分幾種情況:一對一事件處理和一對多事件處理。
一對一事件處理程序是一個控件綁定一個方法上。
一對多是指一多個控件綁定在一個多個方法上。
我們這節課只講述一對一事件處理。
下面我們來看具體的代碼實現:
import wx
class MyFrame(wx.Frame): #該對象繼承於wx.Frame框架
def __init__(self):
super().__init__(parent=None,title="窗口",size=400,300),pos=(100,100))
panel = wx.Panel(parent=self)#將父級容器定義爲窗口(就是這個當前窗口對象self)
statictext = wx.StaticText(parent=panel,label='文字1',pos=(20,20))#文字標籤
#TODO
class App(wx.App): #該對象繼承於wx.App框架
def OnInit(self): #直接實例化該對象並調用此函數,相當於顯示,然後直接在main中進入主事件循環
frame = MyFrame()#執行窗口定義
frame.Show()
return True
def OnExit(self): #可以在這裏釋放一些資源
print("應用程序退出")
return 0
if __name__ == '__main__':#判斷是否是主進程
app=App()
app.MainLoop() #在這裏調用主事件循環
這是我們上節課的代碼。上節課我們學習了Panel面板,編寫了一個程序。我們也得出了一個結論:這應該就是自己編寫的wxPython模板了吧?是的,我們以後再添加代碼,就在TODO那裏寫代碼就行了。那麼今天,我們就用上次的框架爲基礎開始編寫吧。
代碼如下:
import wx
class MyFrame(wx.Frame): #該對象繼承於wx.Frame框架
def __init__(self):
super().__init__(parent=None,title="一對一事件處理",size=(300,180))
self.Center()#居中設置
panel = wx.Panel(parent=self)#將父級容器定義爲窗口(就是這個當前窗口對象self)
self.statictext = wx.StaticText(parent=panel,pos=(20,20))#標籤沒有內容,省略label標籤
b = wx.Button(parent=panel,label='按鈕',pos=(100,50))
class App(wx.App): #該對象繼承於wx.App框架
def OnInit(self): #直接實例化該對象並調用此函數,相當於顯示,然後直接在main中進入主事件循環
frame = MyFrame()#執行窗口定義
frame.Show()
return True
def OnExit(self): #可以在這裏釋放一些資源
print("應用程序退出")
return 0
if __name__ == '__main__':#判斷是否是主進程
app=App()
app.MainLoop() #在這裏調用主事件循環
我們來看看運行狀況:
還不錯,但還沒有綁定。下面來看看如何綁定:
import wx
class MyFrame(wx.Frame): #該對象繼承於wx.Frame框架
def __init__(self):
super().__init__(parent=None,title="一對一事件處理",size=(300,180))
self.Center()#居中設置
panel = wx.Panel(parent=self)#將父級容器定義爲窗口(就是這個當前窗口對象self)
self.statictext = wx.StaticText(parent=panel,pos=(20,20))#標籤沒有內容,省略label標籤
b = wx.Button(parent=panel,label='按鈕',pos=(100,50))
self.Bind(wx.EVT_BUTTON,self.on_click,b)
def on_click(self,event):
print(event)
self.statictext.SetLabelText('Hello,World')
class App(wx.App): #該對象繼承於wx.App框架
def OnInit(self): #直接實例化該對象並調用此函數,相當於顯示,然後直接在main中進入主事件循環
frame = MyFrame()#執行窗口定義
frame.Show()
return True
def OnExit(self): #可以在這裏釋放一些資源
print("應用程序退出")
return 0
if __name__ == '__main__':#判斷是否是主進程
app=App()
app.MainLoop() #在這裏調用主事件循環
我們定義的on_click函數中有一個event參數用於接受事件。而這個SetLabelText函數用於更改標籤文字。
四、總結
這節課我們講述了事件的綁定和處理,希望讀者能從中學到知識,對事件處理進一步加深理解,感謝您的閱讀!