一對多事件處理

一、導入

我們上次簡單講述了一對一事件處理,今天我們來講一講一對多事件處理。

二、一對多處理簡介

無按鈕按下按鈕1按下按鈕2按下
在這個界面中,有兩個按鈕和一行文字標籤。初始是“無按鍵按下”,當點擊button1時,文字標籤的內容改變了爲“按鈕1按下”,button2亦是如此。
我們上次也講過綁定事件,可以使用一個控件綁定一個事件處理者。但是現在呢,我們也可以使用多個控件綁定一個事件處理者。這就是一對多事件處理。

三、具體案例

以下是我們上一次寫的代碼:

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=(110,15))#標籤沒有內容,省略label標籤
		b1 = wx.Button(parent=panel,label='Button1',pos=(100,50))
		b2 = wx.Button(parent=panel,label='Button2',pos=(120,70))
		#self.Bind(wx.EVT_BUTTON,self.on_click,)
	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()         #在這裏調用主事件循環

我們這裏聲明瞭兩個按鈕,暫時不綁定事件。
如果我們聲明瞭許多按鈕,而功能差不多,就需要綁定很多次,不僅代碼多,而且可讀性很差。這是,就可以用到一對多事件處理。
還記得Bind函數中,可通過id進行綁定的情況嗎?沒錯,就是通過id來綁定,我們來回顧一下Bind函數原型:

Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY) 

而這個id參數和id2參數就是用來指定id範圍的,例如:我聲明瞭100個按鈕,id是連續的從零開始的自然數,我要綁定,就可以使用範圍綁定,把id=0,id2=99就可以了。注意,在聲明按鈕時,不要再將id設爲-1了!
下面,我們來看看代碼:

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=(110,15))#標籤沒有內容,省略label標籤
		b1 = wx.Button(parent=panel,label='Button1',pos=(100,50),id=1)
		b2 = wx.Button(parent=panel,label='Button2',pos=(120,70),id=2)
		self.Bind(wx.EVT_BUTTON,self.on_click,id=1,id2=2)#從id爲1的到id爲2的統統綁定到on_click事件上
	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()         #在這裏調用主事件循環

但是呢,這個兩個按鈕肯定是有所不同的,如何區分呢?既然id是按鈕的標識,那我們還用id進行區分。我們在調用on_click函數時,傳入了一個event參數,這個event參數有一個GetId()函數,利用該函數來進行區分。

def on_click(self,event):
	event_id=event.GetId()
	print(event_id)
	if event_id==1:
		self.statictext.SetLabelText('按鈕1按下')
	else:
		self.statictext.SetLabelText('按鈕2按下')

這時,event_id變量記錄着該控件的id。我們可以通過判斷來決定將文字標籤更改爲什麼。完整代碼如下:

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=(110,15))#標籤沒有內容,省略label標籤
		b1 = wx.Button(parent=panel,label='Button1',pos=(100,50),id=1)
		b2 = wx.Button(parent=panel,label='Button2',pos=(120,70),id=2)
		self.Bind(wx.EVT_BUTTON,self.on_click,id=1,id2=2)#從id爲1的到id爲2的統統綁定到on_click事件上
	def on_click(self,event):
        event_id=event.GetId()
	print(event_id)
	if event_id==1:
		self.statictext.SetLabelText('按鈕1按下')
	else:
		self.statictext.SetLabelText('按鈕2按下')
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()         #在這裏調用主事件循環

四、結束語

今天我們講了關於一對多的事件處理,希望大家能自行進一步研究一對多處理。感謝您的閱讀!

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