03-05 “文本进度条”问题分析
_______egon新书来袭请看:https://egonlin.com/book.html
一、"文本进度条"问题分析
1.1 文本进度条
用过计算机的都见过
- 进度条什么原理呢?
1.2 需求分析
- 采用字符串方式打印可以动态变化的文本进度条
- 进度条需要能在一行中逐渐变化
1.3 问题分析
如何获得文本进度条的变化时间?
- 采用sleep()模拟一个持续的进度
- 似乎不那么难
二、"文本进度条"简单的开始
2.1 简单的开始
# 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("------执行结束------")
三、"文本进度条"单行动态刷新
3.1 单行动态刷新
刷新的关键是 \r
- 刷新的本质是:用后打印的字符覆盖之前的字符
- 不能换行:
print()
需要被控制 - 要能回退:打印后光标退回到之前的位置
\r
注意:IDLE如Pycharm屏蔽了\r功能
import time
for i in range(101):
print("\r{:3}%".format(i), end="")
time.sleep(0.1)
四、"文本进度条"实例完整效果
import time
scale = 100
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, '-'))
五、"文本进度条"举一反三
5.1 举一反三
计算问题扩展
- 文本进度条程序使用了
perf_counter()
计时 - 计时方法适合各类需要统计时间的计算问题
- 例如:比较不同算法时间、统计部分程序运行时间
进度条应用
- 在任何运行时间需要较长的程序中增加进度条
- 在任何希望提高用户体验的应用中增加进度条
- 进度条是人机交互的纽带之
文本进度条的不同设计函数
设计名称 | 趋势 | 设计函数 |
---|---|---|
Linear | Constant | 𝑓(𝑥)=𝑥f(x)=x |
Early Pause | Speeds up | 𝑓(𝑥)=𝑥+(1−𝑠𝑖𝑛(𝑥∗π∗2+π/2)/−8f(x)=x+(1−sin(x∗π∗2+π/2)/−8 |
Late Pause | Slows down | 𝑓(𝑥)=𝑥+(1−𝑠𝑖𝑛(𝑥∗π∗2+π/2)/8f(x)=x+(1−sin(x∗π∗2+π/2)/8 |
Slow Wavy | Constant | 𝑓(𝑥)=𝑥+(1−𝑠𝑖𝑛(𝑥∗π∗2+π/2)/8f(x)=x+(1−sin(x∗π∗2+π/2)/8 |
Fast Wavy | Constant | 𝑓(𝑥)=𝑥+(1−𝑠𝑖𝑛(𝑥∗π∗2+π/2)/8f(x)=x+(1−sin(x∗π∗2+π/2)/8 |
Power | Speeds up | 𝑓(𝑥)=(𝑥+(1−𝑥)∗0.03)2f(x)=(x+(1−x)∗0.03)2 |
Inverse Power | Slows down | 𝑓(𝑥)=1+(1−𝑥)1.5∗−1f(x)=1+(1−x)1.5∗−1 |
Fast Power | Speeds up | 𝑓(𝑥)=(𝑥+(1−𝑥)/2)8f(x)=(x+(1−x)/2)8 |
Inverse Fast Power | Slows down | 𝑓(𝑥)=1+(1−𝑥)3∗−1 |