《wxPython in Action》 chapter 1、2 筆記
wxPython 是 wxWidgets 的 Python 實現,“w” for Microsoft Windows and “x” for Unix X server.
wxPython 中,最基本的組件是 wx.App 和 wx.Frame。
每個 wxPython 應用必須包含這兩個組件。wx.App 只有一個,wx.Frame 至少一個。
wx.App 是應用程序,通過 event loop 管理生命周期。
wx.Frame 是窗口,通過在窗口內添加 widget(組件,如 button)控制樣式和行為。
import wx 時執行一些初始化操作,其他包依賴。所以需要先導入。
非 wx 的包則不涉及順序。
所有 wxPython 的操作,必須在 application 的生命周期內進行。
所以,必須先創建 App,后創建Frame。否則報錯:

對于小的應用,可以用如下方式
import wxapp = wx.PySimpleApp() # create App firstframe = wx.Frame(None) # define a subclass and use itframe.Show(True)app.MainLoop()
關鍵點:
執行結果如下:

更優雅的用法是:
創建 wx.App 的子類并實現 OnInit 函數 -> 創建子類的實例。
OnInit 方法中,一般創建至少一個 Frame,并設置為 show。
在 App subclass 的 OnInit 中創建 top-level frame,可以保證創建 Frame 時已有 App 存在。
wx.App 執行 __init__ 時會自動調用子類的 OnInit 方法。
OnInit 無入參,返回 boolean 值,若返回 False,App 立即停止。
子類的初始化一般通過子類的 OnInit 方法實現,而不使用 __init__。
若要自定義子類的 __init__ 方法,則一定要調用 wx.App.__init__(self) ,否則 OnInit 不會執行。
若定義 OnExit 方法,則退出時自動調用。可以不定義。
此處需要特別注意,OnExit 方法中的任何輸出,用戶通常是看不到的,包括 OnExit 執行錯誤的信息。
因為,輸出后立即關閉,速度太快以至于用戶很難看到,或者一閃而過。
實例代碼:
import wxclass KunthApp(wx.App): def OnInit(self): frame = wx.Frame(None) frame.Show(True) return Trueapp = KunthApp()app.MainLoop()
運行結果:

frame 即其他 GUI 工具中的 window,可以在屏幕上移動的窗口。
wxPython 中 window 與 widget 同義,一般不用 window 這個名字,易混淆。
繼承 wx.Frame 實現 subclass,并在 subclass 中封裝樣式控制。
一般在 subclass 的 __init__ 中實現樣式控制,通常需顯式調用父類 wx.Frame 的 __init__。
默認,最后一個 top-level window 退出時,wxPython Application 退出。
可以通過 wx.App 的 SetExitOnFrameDelete(flag) 方法修改默認行為。
top-level window 只沒有 parent 的 frame。
通過 SetTopWindow 手動指定,若沒有指定,則第一個沒有 parent 的 frame 是 parent。
所有窗口關閉后,wxPython 推出前,會執行 wx.App 的 OnExit 方法。
通過自定義 OnExit 方法可以手動控制退出行為,比如 退出時清理數據庫連接等非 wxPython 資源。
可以通過顯式調用 wx.Exit() 強制退出。這種退出對數據是不安全的。
新聞熱點
疑難解答