使用PySide6/PyQt6實現程序啟動畫面的處理
在 PySide6 / PyQt6 或其他 GUI 程序中,啟動畫面主要有以下幾個作用:提升用戶體驗,當主程序初始化需要幾秒鐘時,如果界面一直空白,用戶可能以為程序沒響應;品牌展示,常見做法是在啟動畫面上放置 公司 Logo、應用圖標、版本號、版權信息;程序架構上的過渡,啟動畫面在主窗口創建前顯示,等主程序準備就緒后再關閉,起到 過渡和占位 的作用。
1、簡單例子代碼介紹
在 PySide6 / PyQt6 里要實現啟動畫面(Splash Screen),通常可以用 QSplashScreen 來完成,和 wx.adv.SplashScreen 類似。它的主要作用是在主窗口加載前,先顯示一個過渡畫面(通常放 logo、版本號、加載提示)。
簡單的案例代碼如下所示。
def main(): app = QApplication(sys.argv) # 創建啟動畫面 pixmap = QPixmap(400, 300) # 可以替換為 QPixmap("logo.png") pixmap.fill(Qt.white) # 這里用純白背景 splash = QSplashScreen(pixmap) splash.showMessage("正在加載,請稍候...", Qt.AlignBottom | Qt.AlignCenter, Qt.black) splash.show() # 模擬加載過程(比如初始化數據庫、加載配置等) for i in range(1, 6): splash.showMessage(f"正在加載資源 {i}/5 ...", Qt.AlignBottom | Qt.AlignCenter, Qt.black) app.processEvents() # 讓界面刷新 time.sleep(0.5) # 加載完成后進入主窗口 window = MainWindow() # 延遲關閉啟動畫面并顯示主窗口 QTimer.singleShot(500, lambda: ( splash.finish(window), window.show() )) sys.exit(app.exec()) if __name__ == "__main__": main()
關鍵點:
-
QSplashScreen
-
通過
QSplashScreen(QPixmap)創建。 -
showMessage(text, alignment, color)用來顯示提示信息。 -
finish(widget)在主窗口準備好后關閉 Splash,并顯示目標窗口。
-
-
app.processEvents()
-
在耗時操作中調用,確保 Splash 畫面能刷新,不會卡死。
-
-
QTimer.singleShot()
-
可以避免界面卡頓,等初始化完成后關閉啟動畫面。
-
2、我使用PySide6/PyQt6實現程序啟動畫面
參照上面的過程,我們可以改進下程序啟動畫面,并結合程序初始化等過程進行展示。
我們在程序登錄界面展示,用戶確認登錄成功后,提示啟動畫面的。

用戶登錄成功后,閃屏啟動頁面進行展示

實現過程也是和上面的例子類似,不過增加了一些特殊的處理。
首先封裝好顯示閃屏界面的函數,如下所示。
def show_splash_screen(): """顯示啟動閃屏""" splash_pix = QPixmap("app/images/splash.png") splash = QSplashScreen(splash_pix, Qt.WindowType.WindowStaysOnTopHint) # 設置字體 font = QFont("Arial", 20, QFont.Weight.Bold) splash.setFont(font) splash.showMessage( "正在加載,請稍候...", Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignCenter, Qt.GlobalColor.yellow, ) splash.show() return splash
然后再啟動的main.py的main函數中處理各個操作過程即可。
async def init_app(): app = SystemApp() await app.SetLoginInfo() def main(): app = QApplication(sys.argv) event_loop = QEventLoop(app) asyncio.set_event_loop(event_loop) app_close_event = asyncio.Event() app.aboutToQuit.connect(app_close_event.set) app.setStyle("Fusion") # 設置樣式# 顯示登錄窗口 loginDialog = FrmLogin() if loginDialog.exec() != QDialog.DialogCode.Accepted: # 如果登錄失敗或取消,程序退出 sys.exit(0) # 顯示閃屏 splash = show_splash_screen() # 主窗口 main_window = MainWindow() # 設置托盤圖標 setup_tray_icon(app, main_window) # 閃屏后顯示主界面, 1秒后窗口最大化顯示 QTimer.singleShot(1000, lambda: (splash.close(), main_window.showMaximized())) # sys.exit(app.exec()) with event_loop: event_loop.create_task(init_app()) event_loop.run_until_complete(app_close_event.wait()) if __name__ == "__main__": main()
我們的主程序使用了異步的操作,因此和上面的例子有所差異,在用戶登錄成功后,前端會獲得相關的用戶身份信息,并在 init_app() 函數中進行用戶身份信息的獲取和設置。
我們把用戶身份信息的處理,單獨抽取出來,放在system_app類里面進行處理,如下所示,可以根據登錄用戶的信息,獲取用戶的當前擁有的功能權限,角色集合等等。

前面隨筆我介紹過, 對于列表和對話框界面的封裝,能夠簡化對泛型模型數據的統一處理,通用對于前端用戶身份信息,我們也可以集中在基類中獲取。


編輯對話框的基類同樣的處理。

這樣我們在用戶前端界面中,需要設置用戶當前信息的時候,就可以隨時通過基類函數進行獲取了。
上面代碼,結合閃屏啟動界面的處理過程,介紹了在用戶登錄成功后,對用戶相關信息的處理過程。
專注于代碼生成工具、.Net/Python 框架架構及軟件開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架、Python開發框架等框架產品。
??轉載請注明出處:撰寫人:伍華聰??http://www.iqidi.com?
????
浙公網安備 33010602011771號