一文教你用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能实现的各种进度条效果,如下动图。

一文教你用Python中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()

运行效果:

一文教你用Python中progress库实现进度条

使用 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,进入运行配置页面。

一文教你用Python中progress库实现进度条

Step2. 将 Emulate terminal in output console 选项打钩,然后重新运行代码。

一文教你用Python中progress库实现进度条

细心的小伙伴应该发现了,上面的进度条代码在PyCharm中运行完成后,进度条下有一串奇怪的字符: ‘?[?25h’ ,在终端中用脚本方式 python progress_demo.py 运行相同的代码,不会有这串符号。

这串字符表示的是光标,在PyCharm中运行完成后,光标被输出在控制台上了。解决方法为:按住 Ctrl 键,点击导入的 Bar 类名,跳转到源码 bar.py 中,再按住 Ctrl 键点击 Bar 类继承的 Progress 类,进入 progress 库的 __init__.py 文件中,将该文件中的 SHOW_CURSOR 变量改为空字符串。

一文教你用Python中progress库实现进度条

修改源码后再重新运行代码,光标不显示了,那一串字符也就不显示了。

一文教你用Python中progress库实现进度条

在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()

运行效果:

一文教你用Python中progress库实现进度条

还可以自己修改上面的参数,设置个性化的进度条,本文暂不扩展,以后有空可以专门写文章介绍。

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)

运行效果:

一文教你用Python中progress库实现进度条

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)

运行效果:

一文教你用Python中progress库实现进度条

汇总

接下来将上面介绍的所有种类的进度条全部放到一起,代码如下:

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()

运行效果:

一文教你用Python中progress库实现进度条

运行代码后可以得出所有种类的进度条,与文章开头从官网截的图效果相同。

来源:https://blog.csdn.net/weixin_43790276/article/details/129353510

标签:Python,progress,进度条
0
投稿

猜你喜欢

  • sql2000数据库清除重复数据的二种方法

    2024-01-18 11:08:33
  • Python数字图像处理代数之加减乘运算

    2023-03-20 07:51:26
  • js 分页全选或反选标识实现代码

    2024-04-22 22:44:07
  • 浅析python中特殊文件和特殊函数

    2023-01-22 23:26:26
  • 学习win32com操作word之Range精讲

    2021-05-13 11:36:58
  • 个人网站与动网整合非官方方法

    2009-07-05 18:42:00
  • 使用Dreamweaver代码片断提高css开发效率

    2007-10-28 15:46:00
  • Keras神经网络efficientnet模型搭建yolov3目标检测平台

    2021-10-08 11:45:33
  • Python的Django应用程序解决AJAX跨域访问问题的方法

    2023-08-07 16:00:24
  • ThinkPHP3.0略缩图不能保存到子目录的解决方法

    2024-04-30 08:47:06
  • 简述Python中的进程、线程、协程

    2021-04-07 11:19:02
  • 深入理解golang chan的使用

    2024-05-10 13:59:06
  • Python深入06——python的内存管理详解

    2021-07-29 05:18:26
  • 一文教会你用Python获取网页指定内容

    2023-01-01 09:15:05
  • windows下python 3.6.4安装配置图文教程

    2023-08-10 02:57:37
  • 在JavaScript中使用inline函数的问题

    2024-04-29 13:42:44
  • python-opencv中的cv2.inRange函数用法说明

    2022-09-29 23:39:08
  • 超详细的sql2005图解安装全过程第1/2页

    2024-01-24 17:11:55
  • REPAIR TABLE语法介绍——MySQL数据库

    2012-01-05 19:08:59
  • python动态性强类型用法实例

    2022-08-04 23:32:51
  • asp之家 网络编程 m.aspxhome.com