一文教你用Python中progress库实现进度条
作者:小斌哥ge 发布时间:2023-09-14 10:28:31
progress库安装和介绍
1.安装progress库
progress是Python第三方库,在终端执行 pip 命令安装。
pip install progress
2.progress进度条效果展示
progress的pypi源地址为:https://pypi.org/project/progress/
在官网可以看到progress能实现的各种进度条效果,如下动图。
progress实现进度条
# coding=utf-8
from progress.bar import Bar
import time
# 创建Bar类的实例
bar = Bar('MyProcess:', max=100)
# 循环处理某业务,调用bar对象的next()方法,循环次数等于max
for _ in range(100):
# Do some work
time.sleep(0.05)
bar.next()
# 循环完成后调用finish()方法
bar.finish()
运行效果:
使用 progress 库实现进度条很简单,从 progress 库的 bar.py 中导入 Bar 类,实例化一个对象,然后循环处理业务和调用 next() 方法,处理完成后调用 finish() 方法结束进度条。
Bar 类的主要参数有:
message: 进度条显示的信息,这个参数默认可以用位置参数传给 Bar 。
width: 修改进度条的宽度,默认32。
max: 进度条被分成几等份,如100。
suffix: 进度百分比显示的格式,默认 ‘%(index)d/%(max)d’ 。
fill: 进度条用什么填充,默认’#’ 。
empty_fill: 未加载的进度条用什么填充,默认空格’ ’ 。
bar_prefix: 进度条前缀,默认’ |’ 。
bar_suffix: 进度条后缀,默认’| ’ 。
color: 进度条的颜色,默认None。
PyCharm进度条显示问题解决
大部分Python程序员都使用PyCharm,如果在PyCharm中运行进度条代码后没有显示进度条效果,可以按照如下步骤设置,再重新运行代码。
Step1. 点击PyCharm上方的 Run 按钮,然后点击 Edit Configurations,进入运行配置页面。
Step2. 将 Emulate terminal in output console 选项打钩,然后重新运行代码。
细心的小伙伴应该发现了,上面的进度条代码在PyCharm中运行完成后,进度条下有一串奇怪的字符: ‘?[?25h’ ,在终端中用脚本方式 python progress_demo.py 运行相同的代码,不会有这串符号。
这串字符表示的是光标,在PyCharm中运行完成后,光标被输出在控制台上了。解决方法为:按住 Ctrl 键,点击导入的 Bar 类名,跳转到源码 bar.py 中,再按住 Ctrl 键点击 Bar 类继承的 Progress 类,进入 progress 库的 __init__.py 文件中,将该文件中的 SHOW_CURSOR 变量改为空字符串。
修改源码后再重新运行代码,光标不显示了,那一串字符也就不显示了。
在PyChram中运行进度条,还可能会遇到其他显示问题,建议出现问题时,用脚本的方式运行,以脚本运行的结果为准,PyChram中运行只用来调试代码。
进度条代码的另外两种写法
1. 上下文管理器: 使用 with … as … 上下文管理器的方式编写进度条,进度条完成后无需调用 finish() 方法。
with Bar('Processing', max=20) as bar:
for i in range(20):
time.sleep(0.05)
bar.next()
2. 使用 iter() 方法: 使用 iter() 方法可以简化迭代器的工作,不需要调用 next() 方法。
for i in Bar('Processing').iter(range(100)):
time.sleep(0.05)
这两种实现方式执行的结果与最开始的实现方式一样。
实现更多种类的进度条
1. Bar 系列
前文中点进了progress的源码,可以看到 Bar 类继承自 Progress 类,Progress 类继承自 Infinite 类,Progress 类和 Infinite 类实现了进度条的基本功能。
在 bar.py 中,除了 Bar 类,还有6个类,ChargingBar, FillingSquaresBar, FillingCirclesBar, IncrementalBar, PixelBar, ShadyBar,它们分别是 Bar 类的子类或孙类,继承了进度条的功能,在每一个类中只是修改了 suffix, fill, empty_fill, bar_prefix, bar_suffix这些变量的值,修改了进度条的样式。
使用很简单,只需要导入这些类,将上面代码中的 Bar 换成这些类就行了,如 FillingSquaresBar。
from progress.bar import Bar, ChargingBar, FillingSquaresBar, FillingCirclesBar, IncrementalBar, PixelBar, ShadyBar
import time
bar = FillingSquaresBar('MyProcess:', max=100)
for i in range(100):
time.sleep(0.05)
bar.next()
bar.finish()
运行效果:
还可以自己修改上面的参数,设置个性化的进度条,本文暂不扩展,以后有空可以专门写文章介绍。
2. Spinner 系列
progress 库的 spinner.py 中实现了 5 个类,Spinner, PieSpinner, MoonSpinner, LineSpinner, PixelSpinner。
from progress.spinner import Spinner, PieSpinner, MoonSpinner, LineSpinner, PixelSpinner
for i in Spinner('MySpinner:').iter(range(100)):
time.sleep(0.01)
运行效果:
3.Counter 系列
progress 库的 counter.py 中实现了 4 个类,Counter, Countdown, Stack, Pie。
from progress.counter import Counter, Countdown, Stack, Pie
import time
for i in Counter('Loading:').iter(range(100)):
time.sleep(0.01)
运行效果:
汇总
接下来将上面介绍的所有种类的进度条全部放到一起,代码如下:
from progress.bar import Bar, ChargingBar, FillingSquaresBar, \
FillingCirclesBar, IncrementalBar, PixelBar, ShadyBar
from progress.spinner import Spinner, PieSpinner, MoonSpinner, LineSpinner, PixelSpinner
from progress.counter import Counter, Countdown, Stack, Pie
import time
import random
progess_list = [Bar, ChargingBar, FillingSquaresBar, FillingCirclesBar, IncrementalBar,
PixelBar, ShadyBar, Spinner, PieSpinner, MoonSpinner, LineSpinner,
PixelSpinner, Counter, Countdown, Stack, Pie]
for P in progess_list:
for i in P(P.__name__ + ':').iter(range(100)):
time.sleep(0.01)
bar = IncrementalBar('Random:', suffix='%(index)d%%')
for i in range(100):
bar.goto(random.randint(0, 100))
time.sleep(0.01)
bar.finish()
运行效果:
运行代码后可以得出所有种类的进度条,与文章开头从官网截的图效果相同。
来源:https://blog.csdn.net/weixin_43790276/article/details/129353510


猜你喜欢
- Create PROCEDURE Batch_Delete @TableName nvarchar(100), --表名 @FieldNam
- 生生把写过的java版改成javascript版,第一次写,很不专业,见谅。唉,我是有多闲。var Sudoku = { &nbs
- PDOStatement::bindValuePDOStatement::bindValue — 把一个值绑定到一个参数(PHP 5 >
- 索引合并是mysql底层为我们提供的智能算法。了解索引合并的算法,有助于我们更好的创建索引。索引合并是通过多个range类型的扫描并且合并它
- 有的时候我们会去扫表,然后拿出扫的结果再到另一张表里去查信息。比如下面一段index_sql_str = "select %s f
- 一、引言池化技术在Java中应用的很广泛,简而论之,使用对象池存储某个实例数受限制的实例,开发者从对象池中获取实例,使用完之后再换回对象池,
- 关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码。这样并不利于初学者的学习,希望这篇文章可以更通
- 这篇文章主要介绍了JavaScript回调函数callback用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 开始: ------------------------------------------------------------------
- 转PDF初始代码从文件夹中读取图片数据,然后将他们保存为PDF格式。不长,大概10行代码。from PIL import Imagefrom
- 在Unix和NetWare中推荐使用mysqld_safe来启动mysqld服务器。mysqld_safe增加了一些安全特性,例如当出现错误
- 最近关心电子商务比较多,阿里系产品目前还是业内标杆,值得学习的对象。前几天Jack Ma对支付宝用户体验的严厉批评,成为业内交流热点,据说原
- 本文实例讲述了Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法。分享给大家
- 文 | 闲欢来源:Python 技术「ID: pythonall」今天在浏览知乎时,发现一个有趣的问题:如何优化 Python 爬
- 文件内容如下:Alex 100000Rain 80000Egon 50000Yuan 30000
- 前言前段时间看到有人问如何使用Python实现多张图片组成文字的效果?觉得还挺有意思,于是尝试做了一下,刚好赶上端午节,所以打算从网上下载1
- Web设计师可以使用HTML4和CSS2.1完成一些很酷的东西。我们可以在不使用陈旧的基于table布局的基础上完成文档逻辑结构并创建内容丰
- 本篇文章主要介绍了Python 通过selenium实现毫秒级自动抢购的示例代码,通过扫码登录即可自动完成一系列操作,抢购时间精确至毫秒,可
- 大家好,我是安果!目前公司使用 Jira 作为项目管理工具,在每一次迭代完成后的复盘会上,我们都需要针对本次迭代的&nb
- 在pandas 基础操作大全之数据读取&清洗&分析中介绍了pandas常见的数据处理操作,现在继续对pandas常用的数据合