本文已参与「新人创作礼」活动,一起开启掘金创作之路!
实例四 进度条
文本进度条
- 采用字符串方式打印可以动态变化的文本进度条
- 进度条需要能在一行中逐渐变化
如何获取文本进度条的变化时间
- 采用sleep()模拟一个持续的进度
- 似乎也不太那么难
##### 基本的文本进度条框架的代码实现
# TextProBarV1.py
import time
scale = 10
print("-------执行开始----------")
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale) * 100
print("{:^3.0f}%[{}->{}]".format(c,a,b))
time.sleep(0.1)
print("------执行结束--------")
- 'scale'的含义是文本进度条的宽度;为了模拟一个进度,我们使用了一个for循环;
文本进度条的单行动态刷新
它指的是能够在每一行中根据程序的进度不断地显示文本进度条地信息,但是它并不换行。
单行动态刷新
- 刷新的本质:用后打印的字符覆盖之前的字符
- 不能换行:print()需要被控制
- 要能回退: 打印后光标退回到之前的位置\r
- 刷新的关键\r
#TextProBarV1.py
import time
for i in range(101):
print("\r{:3}%".format(i),end="")
time.sleep(0.1)
- 如果不希望print换行,就在end里添加空字符。 上述代码中的\r总是把输出放在输出行的行首,而且并不换行
完整效果
#TextProBarV3.py
import time
scale = 50
print("执行开始".center(scale//2,"-"))
start = time.perf_counter()
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))
dur变量:用来既可以每一次需要打印文本进度条时所消耗的时间;具体方法就是每次调用time.per_counter函数
举一反三
进度条扩展
- 在任何运行时间需要较长的程序中增加进度条
- 在任何希望提高用户体验的应用中增加进度条
- 进度条时人机交互的纽带之一