一、導入
我們上次簡單講述了一對一事件處理,今天我們來講一講一對多事件處理。
二、一對多處理簡介
在這個界面中,有兩個按鈕和一行文字標籤。初始是“無按鍵按下”,當點擊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() #在這裏調用主事件循環
四、結束語
今天我們講了關於一對多的事件處理,希望大家能自行進一步研究一對多處理。感謝您的閱讀!