wxPython一對一事件處理

一、認識事件

上次我們講完了wx中的Panel面板,今天我們就來說一說關於事件。事件就是指在當前frame窗口中由用戶與機器交互時人爲產生的要求機器捕獲並處理的動作,統稱爲事件,而機器捕獲到事件稱爲捕獲事件,機器捕獲後對其執行稱爲響應事件,從捕獲到響應這段時間稱爲響應時間,響應事件後要執行一些動作,通常爲調用函數來實現反應用戶的操作。事件通常可以是一個按鈕被按下、鼠標移動、鍵盤按鍵捕獲。wxPython可以處理的事件很多,這裏不再過多敘述,大家可以另行了解,或查閱wxPython幫助文件。

事件處理的過程涉及4個要素:

  1. 事件。 它是用戶對界面操作,在wxPython中事件被封裝成事件類wx.Event及其子類,例如按鈕事件類wx.CommandEvent。
  2. 事件類型。 事件類型給出了更多地信息,它是一個整數
  3. 事件源。 它是事件發生的場所,就是各個控件,例如按鈕事件的事件源是按鈕
  4. 事件處理者。 它是在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函數用於更改標籤文字。

四、總結

這節課我們講述了事件的綁定和處理,希望讀者能從中學到知識,對事件處理進一步加深理解,感謝您的閱讀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章