使用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类里面进行处理,如下所示,可以根据登录用户的信息,获取用户的当前拥有的功能权限,角色集合等等。

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


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

这样我们在用户前端界面中,需要设置用户当前信息的时候,就可以随时通过基类函数进行获取了。
上面代码,结合闪屏启动界面的处理过程,介绍了在用户登录成功后,对用户相关信息的处理过程。
使用PySide6/PyQt6实现程序启动画面的处理的更多相关文章
- Qt程序启动画面播放(gif与swf两种动画格式)
学习Qt有一段时间了,发现一个小问题,网上关于Qt的资料或者总结性的学习及应用文章有点少. 比如,Qt完整的API,程序运行之前的启动画面如何按理想效果播放等,每次想在项目中添加一些应用的时候,总是找 ...
- QT之实现程序启动画面
现在好多软件都有,尤其是大型软件,他们要加载的东西太多,因此需要的事件较长,而又不希望给用户产生成为好像没有响应的情况,因此也就需要程序启动画面来实现. 当然了,用widget要比这个丰富很多,不过代 ...
- QSplashScreen类实现Qt程序启动画面
QSplashScreen类实现Qt程序启动画面 收藏人:zwsj 2013-09-13 | 阅:569 转:6 | 来源 | 分享 程序启动 ...
- 用VC制作应用程序启动画面
摘 要:本文提供了四种启动画面制作方法. 使用启动画面一是可以减少等待程序加载过程中的枯燥感(尤其是一些大型程序):二是 可以用来显示软件名称和版权等提示信息.怎样使用VC++制作应用程序的启动画面呢 ...
- MFC之窗体改动工具栏编程状态栏编程程序启动画面
1窗体外观的改动 (1)改动在CMainFrame::preCreateWindow(CREATESTRUCT& cs) 改动标题:cs.style&=FWS_ADDTOTITLE; ...
- Android -- 程序启动画面 Splash
很多应用都会有一个启动界面.欢迎画面慢慢隐现,然后慢慢消隐. 我的方式是使用两个Activity,程序启动时候load第一张Activity,然后由tick触发N秒钟后startActivity另外一 ...
- Delphi开发 Android 程序启动画面简单完美解决方案
原文在这里 还是这个方法好用,简单!加上牧马人做的自动生成工具,更是简单. 以下为原文,向波哥敬礼! 前面和音儿一起研究 Android 下启动画面的问题,虽然问题得到了解决,但是,总是感觉太麻烦,主 ...
- Qt5 程序启动画面动图效果
2333终于实现动图,先弄了一个窗口去掉标题栏假装就是启动画面了,还是那只萌萌的猫这次会动了! 基类用的是QWidget 类名称MainView #ifndef MAINVIEW_H #define ...
- Qt5 程序启动画面图片效果
2333每次打开photoshop开启画面是在酷炫,其实也不难啦. 新建项目名称SplashScreen,基类默认,取消创建界面复选框,完成. 代码如下,图片资源文件自己添加(已上传还未实现动态效果学 ...
- qt程序启动画面
随机推荐
- java基础之运算符的优先级
运算符的优先级(从高到低) 优先 描述 运算符 1 括号 ().[] 2 正负号 +.- 3 自增自减,非 ++.--.! 4 乘除,取余 *./.% 5 加减 +.- 6 移位运算 << ...
- C/C++实现Perigram属性
C/C++实现Perigram属性 通常描述信号瞬时特征的物理量有:瞬时振幅.瞬时相位.及瞬时频率("三瞬参数"),地震波的瞬时参数不仅可以直接用来研究岩性.构造等,而且也能够反演 ...
- Oracle并发控制
并发与锁定 当多用户同一时刻访问相同的数据库资源时,将产生并发.并发极易破坏数据的一致性.锁定是处理并发的重要手段,用户在修改某一资源前,必须首先获得资源的修改权.而这种修改权具有排他性. 并发与锁定 ...
- 想让自己的Ubuntu更漂亮嘛?
近期没啥大项目在进行,今天闲来无事,值班空闲时间,忽然发现自己的Ubuntu竟是如此的"丑"(虽然用过这么多Linux发行版,但不得不承认Ubuntu唯一的优点就是好看!),于是准 ...
- MP3 进行时
MP3 项目立项 责任人:李少帅 开始时间:2016: 10,07 首先观看 MP3视频 理解 MP3 代码 重新 全面看 ucos2 或者是三的 视频代码
- shell 一下子创建多个 led文件
#!bin/bash seq -f "led%0g" 0 110| xargs mkdir for((i = 0;i<36;i++)) do led="led&qu ...
- java 核心编程 toolbar
简介 toolbar code /* * @Author: your name * @Date: 2020-11-08 09:38:15 * @LastEditTime: 2020-11-08 10: ...
- spring-ai 学习系列(4)-MCP 处理过程分析
上一节,通过1个最基本的MCP Server/Client示例,初步了解了MCP的用法.STDIO模式下,client与server同在1台机器上,client会创建1个子进程来启动server,然后 ...
- Unity Shader 像素图描边
思路:在片元着色器中,处理像素p,针对p的上下左右四个像素采样(使用一个变量width来控制描边宽度,也就是处理上下左右多远的像素),若p本身是透明像素,则 若上下左右存在非透明像素,则当前像素p返回 ...
- Leetcode1681-模拟,位运算
题目链接:https://leetcode.cn/problems/count-the-number-of-consistent-strings/description/ 32位int构造出现过的字符 ...