要讓widget元件根據使用者的行為做不同的反應, 就需要建立event. event的功能在於使用者所做的行為: 滑鼠點擊, 鍵盤輸入, ... 以及其他視窗狀態要改變時, 通知視窗做改變.
主要流程可以簡單看成以下幾步 :
- 對每個widget元件榜定某個event發生時所要執行的functino(例如:button在按下時執行某個function, self.Bind(wx.EVT_BUTTON, self.OnClick, function) )
- 程式開始執行時, 在視窗產生以後, 會執行一個無限的迴圈. 在迴圈裡面會檢查事件是否發生, 如果發生就去執行對應的function
- 一直到程式結束的event發生才會離開無限迴圈, 進而結束程式
而在榜定(bind)某個function的時候, 要先知道event的binder. event binder的名稱都是以
wx.EVT_為開頭的.
例如滑鼠的event(wx.MouseEvent)它的binder有以下這些 :
wx.EVT_LEFT_DOWN
wx.EVT_LEFT_UP
wx.EVT_LEFT_DCLICK
wx.EVT_MIDDLE_DOWN
wx.EVT_MIDDLE_UP
wx.EVT_MIDDLE_DCLICK
wx.EVT_RIGHT_DOWN
wx.EVT_RIGHT_UP
wx.EVT_RIGHT_DCLICK
這些分別是各種不同滑鼠event的event binder. 如果要榜定所有的滑鼠event執行同個function, 則可以用wx.EVT_MOUSE_EVENTS.
還有一些比較常用的event binder, 像是button被按下(wx.EVT_BUTTON), menu被按下(wx.EVT_MENU)等等.
而榜定event的方式有兩種 :
- wx.EvtHandler裡面的Bind function, 所有的widget都有繼承wx.EvtHandler, 所以都有Bind function可以使用.
Bind(event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY)
例子 : self.Bind(wx.EVT_BUTTON, self.OnClick, button)
- 把event binder當成函數傳入參數使用.
例子 : wx.EVT_BUTTON(self, self.button.GetId(), self.OnClick)
wx.EvtHandler常用的function :
- AddPendingEvent(event):把event加入處理的queue中, 不會馬上處理, 用於非同步的時候 使用
- Bind(event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY) : 把event和binder綁在一起
- GetEvtHandlerEnabled()
- SetEvtHandlerEnabled( boolean)
- ProcessEvent(event):把event加入處理的queue, 並且馬上處理
參考資料 :
http://www.pythontik.com/blog/article.asp?id=188http://www.pythontik.com/blog/article.asp?id=189