大家好,这里是Seon塞翁。笔者在最近的工作中做了一个基于PyQt5实现GUI的数据处理工具,领导表示“我想一双击就能直接看到情况啊,不要打开后还要我自己输入这个点击那个的!”好吧,既然上头有需求,打工人就得照办。想想以前用过的许多桌面软件,启动时都会有个欢迎画面,同时后台预加载一些内容。那么应该要怎么实现呢?先看看效果吧。

1、界面设计

首先欢迎画面要有一个好看的背景,还有进度条和进度提示信息,那么先用一个 Widget 来做容器,再把用于显示 Logo 和进度信息的 label 拖出来,最后摆上进度条 progressBar

然后是启动加载完成后显示的主页,用一个 lineEdit 显示接收到的预处理结果。

此时启动画面还是一个默认风格的窗体,让我们美化一下样式,让它看起来更像样。

class LoadWin(QWidget, loadwin.Ui_Form):  # 启动画面类 -----------def __init__(self):super(LoadWin, self).__init__()self.setupUi(self)self.setWindowFlags(Qt.FramelessWindowHint)  # 无边框self.setStyleSheet("#Form{background-color:'#4682B4'}""#label_info{background-color:'#4682B4';color:white;font-weight:600;}")  # 设置启动窗背景色和进度信息的字体样式等pix = QPixmap("./load_logo.png")  # 加载logoself.label_logo.setPixmap(pix)self.label_logo.setScaledContents(True)  # 图像拉伸填充

然后是启动计算完成后要显示的主页,定义一个函数接收计算结果。

class MainWin(QWidget, mainwin.Ui_Form):  # 主页界面类 -----------def __init__(self):super(MainWin, self).__init__()self.setupUi(self)def set_data(self, mes):  # 接收进度线程的计算结果self.lineEdit.setText(mes)

2、进度条逻辑

继续完善启动画面类 class LoadWin ,在 __init__ 方法中添加代码,通过定时器来为进度条增值,完成初始化后准备启动计算线程。

self.timer = QBasicTimer()  # 定时器对象
self.main_win = MainWin()  # 进度结束后要显示的主页
self.step = 0  # 进度值
self.proess_run()

实例化线程,分别绑定线程类中的进度环节信号和结束时回传数据的信号。

def proess_run(self):  # 启动进度线程self.cal = LoadThread()  # 线程对象self.cal.part_signal.connect(self.process_set_part)self.cal.data_signal.connect(self.show_main_win)self.cal.start()  # 调用线程run

根据线程回传的进度环节,启动定时器,分步为进度条调整增值速度和增量,设计为完成一个环节后就从头开始增值,即进度条多次重新充满。一般预处理环节不应过多,每个环节执行时间也不宜过长。如下仅设两个环节,用回传的 0 和 1 来识别到了哪一步,而进度条从 0 或 1 开始增值在视觉上也并无太大区别。当然也可根据需要把进度值 0~100 分为多个环节,即进度条总共仅充满一次。

def process_set_part(self, num):self.step = num  # 进度从num开始self.progressBar.setValue(self.step)if num == 0:self.timer.start(20, self)  # 启动QBasicTimer, 每20毫秒调用一次回调函数self.label_info.setText("正在计算数据...")if num == 1:self.timer.stop()  # 重启,调整进度条增值速度self.timer.start(10, self)self.label_info.setText("已完成计算,等待主页加载...")

重写定时器回调函数,为进度条增值。

def timerEvent(self, *args, **kwargs):  # QBasicTimer的事件回调函数self.progressBar.setValue(self.step)  # 设置进度条的值if self.step < 100:self.step += 1

完成计算后将结果传给主页,显示。

def show_main_win(self, mes):self.main_win.set_data(mes)self.main_win.show()self.close()

3、计算线程类

经过以上操作,基础准备才算做好了,下面继续实现真正用于执行任务的部分。run 方法被调用时发射信号,告诉启动界面我要开始第一步啦!完成第一步后再说一声,如此递进到最后回传计算结果。

class LoadThread(QThread):  # 自定义计算线程类 -----------part_signal = pyqtSignal(int)  # 进度环节信号data_signal = pyqtSignal(str)  # 数据传递信号def __init__(self):super().__init__()def run(self):self.part_signal.emit(0)self.fun_part_one()self.part_signal.emit(1)sleep(1)  # 模拟加载耗时self.data_signal.emit("计算结果:2021")def fun_part_one(self):sleep(3)  # 模拟计算耗时

4、回顾流程及源码

一图流回顾执行流程:

附完整代码如下:

from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt, pyqtSignal, QThread, QBasicTimer
import sys
from time import sleep
from myqt import loadwin, mainwinclass LoadWin(QWidget, loadwin.Ui_Form):  # 启动画面类 -----------def __init__(self):super(LoadWin, self).__init__()self.setupUi(self)self.setWindowFlags(Qt.FramelessWindowHint)  # 无边框self.setStyleSheet("#Form{background-color:'#4682B4'}""#label_info{background-color:'#4682B4';color:white;font-weight:600;}")  # 设置启动窗背景色和进度信息的字体样式等pix = QPixmap("./load_logo.png")  # 加载logoself.label_logo.setPixmap(pix)self.label_logo.setScaledContents(True)  # 图像拉伸填充self.timer = QBasicTimer()  # 定时器对象self.main_win = MainWin()  # 进度结束后要显示的主页self.step = 0  # 进度值self.proess_run()def proess_run(self):  # 启动进度线程self.cal = LoadThread()  # 线程对象self.cal.part_signal.connect(self.process_set_part)self.cal.data_signal.connect(self.show_main_win)self.cal.start()  # 调用线程rundef process_set_part(self, num):self.step = num  # 进度从num开始self.progressBar.setValue(self.step)if num == 0:self.timer.start(20, self)  # 启动QBasicTimer, 每20毫秒调用一次回调函数self.label_info.setText("正在计算数据...")if num == 1:self.timer.stop()  # 重启,调整进度条增值速度self.timer.start(10, self)self.label_info.setText("已完成计算,等待主页加载...")def timerEvent(self, *args, **kwargs):  # QBasicTimer的事件回调函数self.progressBar.setValue(self.step)  # 设置进度条的值if self.step < 100:self.step += 1def show_main_win(self, mes):self.main_win.set_data(mes)self.main_win.show()self.close()class LoadThread(QThread):  # 自定义计算线程类 -----------part_signal = pyqtSignal(int)  # 进度环节信号data_signal = pyqtSignal(str)  # 数据传递信号def __init__(self):super().__init__()def run(self):self.part_signal.emit(0)self.fun_part_one()self.part_signal.emit(1)sleep(1)  # 模拟加载耗时self.data_signal.emit("计算结果:2021")def fun_part_one(self):sleep(3)  # 模拟计算耗时class MainWin(QWidget, mainwin.Ui_Form):  # 主页界面类 -----------def __init__(self):super(MainWin, self).__init__()self.setupUi(self)def set_data(self, mes):  # 接收进度线程的计算结果self.lineEdit.setText(mes)if __name__ == '__main__':app = QApplication(sys.argv)w = LoadWin()w.show()sys.exit(app.exec())

另外,笔者入坑PyQt5时写的第一篇文章中也提到了启动画面,是个简易版的仅显示欢迎画面而未有耗时预处理计算的例子,有兴趣可以点击 启动画面与窗口间跳转的实现 看一看哈哈哈。
感谢阅读!

PyQt5实战:你是成熟的软件啦,该有启动画面和加载进度条了!相关推荐

  1. 【多媒体课件制作软件】Focusky教程 | 设置隐藏底部播放进度条

    在播放演示文稿时,有些用户不大喜欢进度条显示在屏幕上,那么这里我们教大家如何在Focusky(也称为"FS软件")放映时显示或隐藏进度条. 新建工程,编辑演示文稿,在菜单栏中找到& ...

  2. vue 判断页面加载完成_Vue实战040:nprogress页面加载进度条

    前言 很多时候在访问网页的时候我们总是看到页面在加载中,可以却不知道要加载多久,无期限的等待总是让人烦躁不安,所以我们希望能知道网页加载的进度,这样我们就能做到心中有数是否继续等待页面加载.这个功能我 ...

  3. Qt实战案例(41)——利用QWinTaskbarButton和QWinTaskbarProgress类实现任务栏进度条的显示

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 pro文件 4.2 widget.h头文件 4.3 widget.cpp源文件 五.效果演示 一.项目介绍 任务栏进度条 ...

  4. Vue项目实战06:nprogress页面加载进度条

    博客: https://lvsige.top/ nprogress页面加载进度条 前言 很多时候在访问网页的时候我们总是看到页面在加载中,可以却不知道要加载多久,无期限的等待总是让人烦躁不安,所以我们 ...

  5. python进度条 pyqt_Python高级进阶#015 pyqt5进度条QProgressBar结合使用qbasictimer

    本期GUI界面,我们继续学习新的控件Qprogressbar. 知识回顾 1.滑动控件qslider 控件设置的关键:设置最大值.最小值,绝对范围. 2.核心类库QtCore,枚举类Qt 核心枚举类的 ...

  6. 【Pyqt5】进度条QProgressBar的使用/多线程更新/按钮美化/图片编码/开机自启动

    前言 诚如标题所见,我在使用Pyqt5进行开发时,先后遇到了上面几个问题.本篇博客就用来记录遇到问题/解决问题的过程,希望能给遇到相同问题的读者一些参考. 项目背景 我的项目是构建一个可视化的交互界面 ...

  7. python你已经是个成熟的软件了_支付宝改自己还花呗表情包_你已经是个成熟的软件系列表情包大全_游戏吧...

    最近很多你已经是个成熟的什么,该学会自己什么非常的火,很多玩家都想要这些表情包.下面游戏吧小编就为各位玩家带来了你已经是个成熟的软件系列表情包大全,快来看看吧. 你已经是个成熟的软件系列表情包大全 保 ...

  8. python你已经是个成熟的软件了_你已经是个成熟的系列表情包大全_支付宝微信等软件中招_软吧...

    最近在抖音短视频上有一组非常有趣的表情图片是关于你已经是个成熟的软件的,其中支付宝微信等软件都被教育一番,看起来非常可爱,下面来看看小编为大家带来的这组表情的分享. 保存方法:在手机上长按本系列图片即 ...

  9. 移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践

    这篇是计算机类的优质预售推荐>>>><移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践> 国内顶级互联网公司測试实战经验总结.阿里.腾讯.京东.携程.百 ...

最新文章

  1. 台湾大学林教授libsvm在matlab的安装
  2. 面试中有哪些经典的数据库问题?
  3. Visual Studio 2017 15.7 Preview 1 发布
  4. spring 测试 事务_Spring陷阱:事务测试被认为是有害的
  5. ext3 tree tbar 初始化定义
  6. html中什么是语义,html – “语义正确”是什么意思?
  7. python下载图片到文件夹_python实现解析markdown文档中的图片,并且保存到本地~
  8. 维信诺全柔AMOLED产线启用 对“加入华为供应链”一事避而不谈
  9. FFmpeg-2、编解码及视频像素格式尺寸转换和音频重采样
  10. Java——NIO和IO的区别
  11. 简单动态网站的搭建流程
  12. 人力资源管理专业知识与实务(中级)
  13. Android自定义控件(状态提示图表,我先收藏为敬
  14. matlab批量将mp3文件转wav文件
  15. Centos中IP地址的动静转换
  16. js 输出为underfined
  17. CSS实战样式:文字两侧加居中横线
  18. 拳王虚拟项目公社:新媒体多渠道变现,生财有道?
  19. linux服务器新装hba卡,EmulexHBA卡在Linux下的安装方法
  20. 响应式布局——Bootstrap

热门文章

  1. react在线编辑Excel表格
  2. Mysql客户端navicat的使用并连接远程数据库【重点】
  3. python简单抽奖系统_python实现的简单抽奖系统实例
  4. 聊聊我在职场的至暗时刻!
  5. L1-078 吉老师的回归 (15 分) C语言
  6. python爬虫进程和线程的区别_熬了两个通宵写的!终于把多线程和多进程彻底讲明白了!...
  7. 中兴力维动环监控接线图_中兴力维传统动环监控系统解决方案
  8. 双月学习OKR(67月)
  9. 对于Java的MyBatis的入门
  10. c语言——输出字母c