1. 程式人生 > 實用技巧 >020 例項4-文字進度條

020 例項4-文字進度條

目錄

一、"文字進度條"問題分析

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)=xf(x)=x
Early Pause Speeds up f(x)=x+(1sin(xπ2+π/2)/8f(x)=x+(1−sin(x∗π∗2+π/2)/−8
Late Pause Slows down f(x)=x+(1sin(xπ2+π/2)/8f(x)=x+(1−sin(x∗π∗2+π/2)/8
Slow Wavy Constant f(x)=x+(1sin(xπ2+π/2)/8f(x)=x+(1−sin(x∗π∗2+π/2)/8
Fast Wavy Constant f(x)=x+(1sin(xπ2+π/2)/8f(x)=x+(1−sin(x∗π∗2+π/2)/8
Power Speeds up f(x)=(x+(1x)0.03)2f(x)=(x+(1−x)∗0.03)2
Inverse Power Slows down f(x)=1+(1x)1.51f(x)=1+(1−x)1.5∗−1
Fast Power Speeds up f(x)=(x+(1x)/2)8f(x)=(x+(1−x)/2)8
Inverse Fast Power Slows down f(x)=1+(1x)31f(x)=1+(1−x)3∗−1