一、"文本進度條"問題分析
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 |
