课程来源:[中国大学MOOC_Python语言程序设计_北京理工大学_崇天](https://www.icourse163.org/learn/BIT-268001?tid=1002788003
三、基本数据类型
3.5 实例4:文本进度条
进度条
需求分析
文本进度条
- 采用字符串方式打印可以动态变化的文本进度条
- 进度条需要能在一行中逐渐变化
如何获得文本进度条的变化时间
- 采用sleep()模拟一个进度条
文本进度条的简单开始
#TimeProBarV1.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("-----执行结束-----")
>>>
-----执行开始-----
0 %[->..........]
10 %[*->.........]
20 %[**->........]
30 %[***->.......]
40 %[****->......]
50 %[*****->.....]
60 %[******->....]
70 %[*******->...]
80 %[********->..]
90 %[*********->.]
100%[**********->]
-----执行结束-----
"文本进度条"单行动态刷新
单行动态刷新,关键\r
- 刷新的本质:用后打印的字符覆盖之前的字符
- 不能换行:print()需要被控制。print()默认输出后换行
- 要能退回:打印后光标退回到之前的位置 \r
#TimeProBarV2.py
import time
print("-----执行开始-----")
for i in range(101):
print("\r{:3}%".format(i), end = "") #\r表示再打印输出字符串时先使光标退回到行首
time.sleep(0.1)
print("-----执行结束-----")
"文本进度条"实例完整效果
完整效果
#TimeProBarV3.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}%[{}->{}]".format(c, a, b, dur), end = "")
time.sleep(0.1)
print("执行结束".center(scale//2, '-'))
举一反三
计算问题扩展
- 文本进度条程序使用了perf_counter()计时
- 计时方法适合各类需要统计时间的计算问题
- 例如:比较不同算法的时间、统计部分程序运行时间
进度条扩展
- 在任何运行时间需要较长的程序中增加进度条
- 在任何希望提高用户体验的应用中增加进度条
- 进度条是人机交互的纽带之一
九种不同的进度条
<center>设计名称</center> | <center>趋势</center> | <center>描述</center> |
---|---|---|
Linear | Constant | f(x) = x |
Early Pause | Speeds up | f(x) = x + (1-sin(xπ2+π/2))/-8 |
Late Pause | Slows down | f(x) = x + (1-sin(xπ2+π/2))/8 |
Slow Wavy | Constant | f(x) = x+sin(xπ5)/20 |
Fast Wavy | Constant | f(x) = x+sin(xπ20)/80 |
Power | Speeds up | f(x) = (x+(1-x)*0.03)2 |
Inverse Power | slows down | f(x) = 1+(1-x)1.5*-1 |
Fast Power | Speeds up | f(x) = (x+(1-x)/2)8 |
Inverse Fast Power | Slows down | f(x) = 1+(1-x)3*-1 |