2008-10-23

wxPython -- event driven介紹

wxPython是很標準事件驅動(event driven)設計的平台,在了解它如何掌握事件前,需要先了解可能會用到的名詞:

事件(event):在你的應用程序期間發生的事情,它要求有一個回應。

事件物件(event object):在wxPython中,它具體代表一個事件,其中包括了事件的數據等屬性。它是類wx.Event或其子類別的實例,子類別如wx.CommandEvent和wx.MouseEvent。

事件類型(event type):wxPython分配給每個事件對象的一個整數ID。事件類型給出了關於該事件本身更多的信息。

事件來源(event source):任何wxPython對象都能產生事件。例如按鈕、選單、對話框和任何別的窗口部件。

事件驅動(event-driven):一個程序結構,它的大部分時間花在等待或回應事件上。

事件序列(event queue):已發生的但未處理的事件的一個序列。

事件處理器(event handler):回應事件時所採用的函數或方法。

事件連結器(event binder):一個封裝了特定視窗物件,特定事件類型和一個事件處理器的wxPython對象。為了被使用,所有事件處理器必須用一個事件連結器來註冊。

wx.EvtHandler:一個wxPython類,它允許其實例在特定類別、事件來源和事件處理器之間建立關聯。


事件驅動系統的主迴圈類似於客戶服務中心的操作者。當沒有任何呼叫時,操作者處於等待狀態。當發生事件時,如電話鈴響了,操作者開始回應,他與客戶交談直到獲得足夠的訊息以分派該客戶給一個合適的回答者。然後操作者等待下一個事件。

儘管各事件驅動系統間都有一些不同,但它們有很多相似的地方。下面列出了事件驅動程式結構的主要特點:

1、在初始化設置之後,程式大部分的時間花在了一個迴圈中。進入這個迴圈就意謂著程式與用戶互動的開始,退出這個迴圈就代表結束。在 wxPython中,迴圈是:wx.App.MainLoop()。當所有Top-Level窗口都被關閉後就會退出這迴圈。

2、程式包含了對應於發生在程式中所有的事件。事件通常由用戶的行為來觸發,但也可以由系統的行為或程序中其他任意的代碼。在wxPython中,所有的事件都是類wx.Event或其子類的一個實例。每個事件都有一個事件類型屬性,它使得不同的事件能夠被辨別。

3、處於空迴圈時,程式定期檢查是否有任何請求回應的事件發生。有兩種機制使得事件驅動系統可以得到有關事件的通知。最常被wxPython使用的方法是,把事件傳送到一個序列裡,由該序列觸發相應事件處理。另一種方法是使用輪詢的方法,所有可能引發事件的事件都會被定期詢問是否有未處理的事件。

4、當事件發生時,系統依照事件試著確定相關代碼來處理該事件,如果有,相關代碼被執行。在wxPython中,原系統事件被轉換為wx.Event實例,然後使用 wx.EvtHandler.ProcessEvent()方法將事件分派給適當的處理器代碼。

在wxPython程式中,事件和事件處理器是以相關視窗物件為基礎。並且特定以下的語法來作關聯:

self.Bind(wx.EVT_BUTTON, self.OnClick, aButton)

上例使用了內建定義的事件連結器對wx.EVT_BUTTON來將aButton上的按鈕點擊事件與方法self.OnClick關聯起來。

縱使wxPython程式表面上看起來在被動地等待事件,但它仍在做事。它在執行wx.App.MainLoop(),這是是一個無限的迴圈。在wxPython in Action裡面有段描述是很值得參考的:

while True:
while not self.Pending():
self.ProcessIdle()
self.DoMessage()


這意思是如果沒有未處理的訊息,就做一些空閒時該做的事;如果有訊息進入,那麼將它分派給適當的事件處理方法。

在 wxPython中,大部分視窗物件在回應低階事件時都會導致高階事件發生。例如,在一個wx.Button上的滑鼠點擊會產生EVT_BUTTON事件,該事件是wx.CommandEvent的特定類型。類似的,在一個窗口的角中拖動鼠標將導致wxPython為你自動創建一個 wx.SizeEvent事件。高級事件的用處是讓你的系統的其它部分更容易聚焦於最有關聯的事件上,而不是陷於追蹤每個鼠標單擊。高級事件能夠封裝更多關於事件的有用的信息。當你創建你自已的定制的窗口部件時,你能定義你自己的定制事件以便管理事件的處理。

在wxPython中,有一些wx.Event的子類。這裡把最常用到列出。一個事件類可以有多個事件類型,每個都對應於一個不同的用戶行為。

wx.CloseEvent:當一個frame關閉時被觸發。這個事件的類型分為一個通常的frame關閉和一個系統關閉事件。
wx.CommandEvent:與視窗部件的簡單的各種互動都將觸發這個事件,如按鈕點擊、功能選項點選、單選按鈕選擇。這些互動有它各自的事件類型。許多更複雜的視窗部件。。
wx.KeyEvent:按鍵事件。這個事件的類型分按下按鍵、釋放按鍵、按住按鍵動作。
wx.MouseEvent:滑鼠事件。這個事件的類型分滑鼠移動和滑鼠敲擊。對於哪個滑鼠按鈕被點擊和是單擊還是雙擊都有各自的事件類型。
wx.PaintEvent:當視窗的內容需要被重畫時觸發。
wx.SizeEvent:當視窗的大小或其佈局改變時觸發。
wx.TimerEvent:可以由類wx.Timer類創建,它是定期的事件。

通常,事件對像需要使用事件連結器和事件處理系統將它們傳遞給相關的事件處理器。

沒有留言: