在 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实现程序启动画面
参照上面的过程,我们可以改进下程序启动画面,并结合程序初始化等过程进行展示。
我们在程序登录界面展示,用户确认登录成功后,提示启动画面的。

用户登录成功后,闪屏启动页面进行展示

实现过程也是和上面的例子类似,不过增加了一些特殊的处理。
首先封装好显示闪屏界面的函数,如下所示。
defshow_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 definit_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类里面进行处理,如下所示,可以根据登录用户的信息,获取用户的当前拥有的功能权限,角色集合等等。

前面随笔我介绍过, 对于列表和对话框界面的封装,能够简化对泛型模型数据的统一处理,通用对于前端用户身份信息,我们也可以集中在基类中获取。


编辑对话框的基类同样的处理。

这样我们在用户前端界面中,需要设置用户当前信息的时候,就可以随时通过基类函数进行获取了。
上面代码,结合闪屏启动界面的处理过程,介绍了在用户登录成功后,对用户相关信息的处理过程。