目錄
一、"文本進度條"問題分析
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("------執行結束------")
------執行開始------
0 %[->..........]
10 %[*->.........]
20 %[**->........]
30 %[***->.......]
40 %[****->......]
50 %[*****->.....]
60 %[******->....]
70 %[*******->...]
80 %[********->..]
90 %[*********->.]
100%[**********->]
------執行結束------
三、"文本進度條"單行動態刷新
3.1 單行動態刷新
刷新的關鍵是 \r
- 刷新的本質是:用后打印的字符覆蓋之前的字符
- 不能換行:
print()
需要被控制 - 要能回退:打印后光標退回到之前的位置
\r
注意:IDLE如Pycharm屏蔽了\r
功能
# TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i), end="")
time.sleep(0.1)
100%
四、"文本進度條"實例完整效果
# TextProBarV3.py
import time
scale = 10
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, '-'))
-執行開始
100%[**********->]1.03s
-執行結束
五、"文本進度條"舉一反三
5.1 舉一反三
計算問題擴展
- 文本進度條程序使用了
perf_counter()
計時 - 計時方法適合各類需要統計時間的計算問題
- 例如:比較不同算法時間、統計部分程序運行時間
進度條應用
- 在任何運行時間需要較長的程序中增加進度條
- 在任何希望提高用戶體驗的應用中增加進度條
- 進度條是人機交互的紐帶之
文本進度條的不同設計函數
設計名稱 | 趨勢 | 設計函數 |
---|---|---|
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+(1-sin(x*π*2+π/2)/8\) |
Fast Wavy | Constant | \(f(x) = x+(1-sin(x*π*2+π/2)/8\) |
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\) |