2008年5月26日 星期一

wxPython的Event

要讓widget元件根據使用者的行為做不同的反應, 就需要建立event. event的功能在於使用者所做的行為: 滑鼠點擊, 鍵盤輸入, ... 以及其他視窗狀態要改變時, 通知視窗做改變.

主要流程可以簡單看成以下幾步 :

  1. 對每個widget元件榜定某個event發生時所要執行的functino(例如:button在按下時執行某個function, self.Bind(wx.EVT_BUTTON, self.OnClick, function) )
  2. 程式開始執行時, 在視窗產生以後, 會執行一個無限的迴圈. 在迴圈裡面會檢查事件是否發生, 如果發生就去執行對應的function
  3. 一直到程式結束的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的方式有兩種 :
  1. 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)
  2. 把event binder當成函數傳入參數使用.
    例子 : wx.EVT_BUTTON(self, self.button.GetId(), self.OnClick)
wx.EvtHandler常用的function :
  1. AddPendingEvent(event):把event加入處理的queue中, 不會馬上處理, 用於非同步的時候 使用
  2. Bind(event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY) : 把event和binder綁在一起
  3. GetEvtHandlerEnabled()
  4. SetEvtHandlerEnabled( boolean)
  5. ProcessEvent(event):把event加入處理的queue, 並且馬上處理

參考資料 :
http://www.pythontik.com/blog/article.asp?id=188
http://www.pythontik.com/blog/article.asp?id=189

沒有留言: