在大型计算时(例如神经网络训练),经常会遇到计算时间过长,无法知道当前的计算进度,无法判断程序是否进入死循环等问题。采用进度条可以在一定程度上了解当前进度,判断后续所需的计算时间,缓解等待过程中的焦虑。在计算进程中可以放心地去干其他事情。

1.常规进度条

常规的方法是使用打印字符的形式展示当前的进度,但这一类进度条很容易被淹没在其他需要显示的内容中,使用起来比较繁琐,想要知道多个任务进行到了第几个了还要从打印历史中手动查看。字符进度显示的例子如下:

计算进度:|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>| 100.0%

2.GUI进度条

最为合适的方法是创建弹窗进度条,在弹窗中实时显示当前进行的子任务及子任务执行的进度。

基于pycharm+pyqt5 实现的弹窗进度条的效果如下,pyqt5 的安装请搜索其他案例,在此不具体介绍了。

填坑:请注意在pyqt5图形设计界面中生成的python代码直接运行时会出现卡顿,直到进度条到达100%后才显示的情况。这是因为没有设置窗口刷新,请在设置好进度值之后使用 QApplication.processEvents() 进行窗口的刷新,简单易行,对于间隔时间较短的情况无需建立两个线程进行通信。

不想了解上述坑的同学,可以直接使用如下简单易用的代码,将其放在自己的用户包中,随时调用(喜欢和认为有用朋友可以给我点个赞!):

# _*_coding: UTF-8_*_
# 开发作者 :TXH
# 开发时间 :2020-09-08 10:20
# 文件名称 :Qt_Processbar.py
# 开发工具 :Python 3.7 + Pycharm IDEfrom PyQt5.QtWidgets import QApplication, QWidget, QDialog, QLabel, QLineEdit, QProgressBar, \QPushButton, QVBoxLayout, QHBoxLayout, QGridLayout, QDialogButtonBox
from PyQt5.QtCore import Qt, QBasicTimer, QThread,QRect
import sysclass ProgressBar(QDialog):def __init__(self,  parent=None):super(ProgressBar, self).__init__(parent)# Qdialog窗体的设置self.resize(500, 32) # QDialog窗的大小# 创建并设置 QProcessbarself.progressBar = QProgressBar(self) # 创建self.progressBar.setMinimum(0) #设置进度条最小值self.progressBar.setMaximum(100)  # 设置进度条最大值self.progressBar.setValue(0)  # 进度条初始值为0self.progressBar.setGeometry(QRect(1, 3, 499, 28)) # 设置进度条在 QDialog 中的位置 [左,上,右,下]self.show()def setValue(self,task_number,total_task_number, value): # 设置总任务进度和子任务进度if task_number=='0' and total_task_number=='0': self.setWindowTitle(self.tr('正在处理中'))else:label = "正在处理:" + "第" + str(task_number) + "/" + str(total_task_number)+'个任务'self.setWindowTitle(self.tr(label)) # 顶部的标题self.progressBar.setValue(value)class pyqtbar():'''task_number和 total_task_number都为 0 时,不显示当前进行的任务情况task_number<total_task_number 都为整数,错误的设置将出现错误显示,暂未设置报错警告# 使用示例import timebar = pyqtbar() # 创建实例total_number=10# 任务1task_id=1for process in range(1, 100):time.sleep(0.05)bar.set_value(task_id,total_number,process) # 刷新进度条# 任务2task_id = 2for process in range(1, 100):time.sleep(0.05)bar.set_value(task_id, total_number,process)bar.close # 关闭 bar 和 app'''def __init__(self):self.app = QApplication(sys.argv) # 打开系统 appself.progressbar = ProgressBar() # 初始化 ProcessBar实例def set_value(self,task_number,total_task_number,i):self.progressbar.setValue(str(task_number), str(total_task_number),i + 1)  # 更新进度条的值QApplication.processEvents()  # 实时刷新显示@propertydef close(self):self.progressbar.close()  # 关闭进度条self.app.exit() # 关闭系统 appif __name__ == '__main__':import time# 使用示例bar=pyqtbar() # 创建实例total_number=10 # 总任务数# 任务1task_id=1 # 子任务序号for process in range(1, 100):time.sleep(0.05)bar.set_value(task_id,total_number,process) # 刷新进度条# 任务2task_id = 2for process in range(1, 100):time.sleep(0.05)bar.set_value(task_id, total_number,process)bar.close # 关闭 bar 和 app

3.多线程进度条方案(用于单步耗时较高的情况)

对于时长超过5秒的高耗时迭代计算,第2节的方案会出现卡顿,在此给出使用多线程进行计算的方案。其中需要:1.将要运行的代码块构建成 Qthread 类(子线程),在Qthread实例中不断将单个任务进度和总的任务进度通过pyqtSignal功能发送给主线程;2.pyqtbar()类在初始化时需要传入上述Qthread实例。后续主线程根据子线程发送的信号进行更新,不会出现卡顿的情况。

踩坑:在Qthread 代码块中不要使用基于pyqt5 的matplotlib 绘图功能,否则整个程序将卡在绘图代码处。

# _*_coding: UTF-8_*_
# 开发作者 :TXH
# 开发时间 :2020/9/14 1:44
# 文件名称 :pyqtbar.py
# 开发工具 :Python 3.7+ Pycharm IDEfrom PyQt5 import QtWidgets, QtCore
import sys
from PyQt5.QtCore import *
import timeclass ProcessBar(QtWidgets.QWidget):def __init__(self,work):super().__init__()self.work=workself.run_work()def run_work(self):# 创建线程# 连接信号self.work._signal.connect(self.call_backlog)  # 进程连接回传到GUI的事件# 开始线程self.work.start()# 进度条设置self.pbar = QtWidgets.QProgressBar(self)self.pbar.setMinimum(0)  # 设置进度条最小值self.pbar.setMaximum(100)  # 设置进度条最大值self.pbar.setValue(0)  # 进度条初始值为0self.pbar.setGeometry(QRect(1, 3, 499, 28))  # 设置进度条在 QDialog 中的位置 [左,上,右,下]# 窗口初始化self.setGeometry(300, 300, 500, 32)self.setWindowTitle('正在处理中')self.show()# self.work = None  # 初始化线程def call_backlog(self, msg,task_number,total_task_number):if task_number==0 and total_task_number==0:self.setWindowTitle(self.tr('正在处理中'))else:label = "正在处理:" + "第" + str(task_number) + "/" + str(total_task_number)+'个任务'self.setWindowTitle(self.tr(label)) # 顶部的标题self.pbar.setValue(int(msg))  # 将线程的参数传入进度条class pyqtbar():def __init__(self,work):self.app = QtWidgets.QApplication(sys.argv)self.myshow = ProcessBar(work)self.myshow.show()sys.exit(self.app.exec_())if __name__ == "__main__":# 继承QThreadclass Runthread(QThread):#  通过类成员对象定义信号对象_signal = pyqtSignal(int,int,int)def __init__(self):super(Runthread, self).__init__()def run(self):        task_number = 0total_task_number = 9    for i in range(100):###########################                        ##将需要计算的代码块放在此处##                        ###########################time.sleep(0.1)self._signal.emit(i + 1,task_number ,total_task_number )  # 发送实时任务进度和总任务进度work = Runthread()bar=pyqtbar(work)

基于pyqt5 构建弹窗进度条,在大型计算中实时显示进度相关推荐

  1. java excel进度条_导出excel 用easyui显示进度条(也适用于其他框架遮罩层,进度条)...

    每次我们导出excel的时候 ,如果数据量很大,导出花费的时间会很长,页面却有没人任何反应,这个时候用户会认为系统有问题,要么关了页面,要么狂点导出.感知太差了~甚至用户误操作会导致服务器崩溃. 所以 ...

  2. java 上传 进度条_Ajax上传文件并显示进度条

    第四步:编写前端代码. 1.路径在 当前项目的:src\main\resources\asyn.html 上传进度条 align="center"> 0% bordercol ...

  3. 基于Jquery插件Uploadify实现实时显示进度条上传图片

    网址:http://www.jb51.net/article/83811.htm 这篇文章主要介绍了基于Jquery插件Uploadify实现实时显示进度条上传图片的相关资料,感兴趣的小伙伴们可以参考 ...

  4. html资源文件记载进度条,HTML5矢量实现文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...

  5. python特效进度条_六种酷炫Python运行进度条

    作者 | 行哥 来源 | 一行数据 之前行哥给大家推荐过一个windows神器,里面有个小功能是人生进度条,可以看到2020年的进度只剩下一半,那么你的代码进度还剩多少呢? 这不,行哥本文介绍了目前6 ...

  6. android进度条课设报告,Android开发之进度条ProgressBar的示例代码

    说明 ProgressBar一般用于显示一个过程,例如数据加载过程,文件下载进度,音乐播放进度等. 默认形式ProgressBar 默认方式下,ProgressBar显示为圆形进度,循环转圈,不显示具 ...

  7. python 进度条_六种酷炫Python运行进度条

    作者 | 行哥 来源 | 一行数据 之前行哥给大家推荐过一个windows神器,里面有个小功能是人生进度条,可以看到2020年的进度只剩下一半,那么你的代码进度还剩多少呢? 这不,行哥本文介绍了目前6 ...

  8. android 进度条图标方形_Android - 条纹进度条实现,调整view宽度仿进度条

    相关代码请参阅: https://github.com/RustFisher/aboutView/blob/master/app/src/main/java/com/rust/aboutview/ac ...

  9. python 进度条_6种酷炫Python运行进度条

    本文介绍了目前6种比较常用的进度条,让大家都能直观地看到脚本运行最新的进展情况 1.普通进度条 2.带时间进度条 3.tpdm进度条 4.progress进度条 5.alive_progress进度条 ...

最新文章

  1. html 显示消息数量,html实现消息按钮上的数量角标的实例详解
  2. linux ubuntu 16.04下deb文件的安装以及一些问题的解决
  3. 小程序服务器角色,小程序在我们的生活中扮演什么角色?
  4. 腾讯下一步:关注通用AI,加大投入产业互联网,推出医疗新品AI显微镜
  5. java设置手指点击_java设置鼠标在jpanel时变为手指形状
  6. 汇编 MOVSX与MOVZX 指令
  7. 关于mvn install命令执行报错问题
  8. DevOps工程师到底做些什么?
  9. 网站地图(sitemap)在线生成
  10. 用Python写个「倒计时」软件
  11. 数字0~9的手写识别
  12. lvgl cont(容器)
  13. 惠民工程(2013中南大学研究生复试[最小生成树])
  14. 临沂大学计算机考研资料汇总
  15. Docker笔记(精简版)
  16. chrome 浏览器 64位最新版 flash 无法加载插件 问题解决
  17. tp ajax 搜索分页
  18. C#时间转换几秒几分钟.....前
  19. 分享一些web前端工程师常用且实用的网站
  20. 《Google工作整理术》读书笔记

热门文章

  1. Xposed 插件开发之二: Xposed的一些知识
  2. Python的集合框架
  3. (蓝桥杯)数字三角形。。(最简单的dp题)
  4. 解读:基于订单流、技术分析与神经网络的期货短期走势预测模型
  5. 3d打印英语文献_3D打印合集,从设计,技术到工业制造应用!
  6. sas html5,什么是sas?
  7. led流水灯c语言程序移位,LED流水灯程序 移位写法
  8. 在平板电脑与移动3G大爆炸的时代,昔日霸主微软的反击
  9. 【java学习】集合框架
  10. 【手机】手机选购指南