wxPython 基本框架與運行原理 -- App 與 Frame


《wxPython in Action》 chapter 1、2 筆記

wxPython 是 wxWidgets 的 Python 實現,“w” for Microsoft Windows and “x” for Unix X server.

1. 概述

wxPython 中,最基本的組件是 wx.App 和 wx.Frame。

每個 wxPython 應用必須包含這兩個組件。wx.App 只有一個,wx.Frame 至少一個。

wx.App 是應用程序,通過 event loop 管理生命周期。

wx.Frame 是窗口,通過在窗口內添加 widget(組件,如 button)控制樣式和行為。

1.1 先 import wx 再 import wx其他包

import wx 時執行一些初始化操作,其他包依賴。所以需要先導入。

非 wx 的包則不涉及順序。

1.2 先建 App 后建 Frame

所有 wxPython 的操作,必須在 Application 的生命周期內進行。

所以,必須先創建 App,后創建Frame。否則報錯:

2. 最簡單的 App

對於小的應用,可以用如下方式

import wx

app = wx.PySimpleApp()  # create App first
frame = wx.Frame(None)  # define a subclass and use it
frame.Show(True)
app.MainLoop()

關鍵點:

  1. 創建 wx.App 實例,此處使用 wx.App 的 subclass wx.PySimpleApp。
  2. 創建 frame 並設置其樣式與行為。
  3. 啟動 App 的 MainLoop。

執行結果如下:

3. 自定義 App 的 subclass -- 推薦

更優雅的用法是:

創建 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 wx

class KunthApp(wx.App):
    def OnInit(self):
        frame = wx.Frame(None)
        frame.Show(True)
        return True

app = KunthApp()
app.MainLoop()

運行結果:

4. Frame

frame 即其他 GUI 工具中的 window,可以在屏幕上移動的窗口。

wxPython 中 window 與 widget 同義,一般不用 window 這個名字,易混淆。

 

繼承 wx.Frame 實現 subclass,並在 subclass 中封裝樣式控制。

一般在 subclass 的 __init__ 中實現樣式控制,通常需顯式調用父類 wx.Frame 的 __init__。

5. 窗口的關閉與程序退出

默認,最后一個 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() 強制退出。這種退出對數據是不安全的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM