業餘碼農學Python-16:簡單文本進度條製作

業餘碼農學Python-16:簡單文本進度條製作

學Python這麼多天,除了之前的海龜畫圖之外,最近學的一個實例算是讓我再一次感受到成就感:一個每次安裝程序都能見到的實例——進度條。

進度條在計算機使用中可以說是隨處可見,是每一個接觸過電腦的人都知道的東西,但是這個玩意兒看似簡單,學過之後才發現,進度條竟然也有些許隱藏的套路

一、進度條簡單介紹

  • 進度條從呈現形式有多種多樣,有的設計非常漂亮、色彩豐富;
業餘碼農學Python-16:簡單文本進度條製作

  • 深入研究進度條的進度展示函數是才發現也是套路滿滿

(界面顯示的進度大部分都不是採用線性方法計算出來,直白點講就是實際進度和顯示進度多數都是不一致的。下圖是主流的幾種顯示進度的計算函數)。

業餘碼農學Python-16:簡單文本進度條製作

二、文本進度條實例

話不多說,上手實踐,走起。因為初學,所以粗糙。只能先來個最糙的文本進度條(不忽悠,線性時間展示)。

  • 實例目標:

採用字符串方式打印可以動態變化的文本進度條,進度條在一行中逐漸變化

  • 問題分析:

借鑑大象進冰箱的步驟,這個問題我們也來分三步。第一步,實現計時;第二步,展示每一次進度;第三步,把每一次的進度展示整到一行裡面。下面我們開始:

  • 第一步,實現計時
<code>import time  #導入time庫
start = time.perf_counter() #計時開始
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
print(dur) #輸出/<code>
  • 第二步,展示每一次進度;

要展示每一次進度,我們需要引入一個過程(取一個最簡單的函數,我們採用for循環,每次循環我們讓時間延遲0.1秒)

<code>import time  #導入time庫
start = time.perf_counter() #計時開始
for i in range(50): #循環50次
time.sleep(0.1) #延遲0.1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
print("{:.2f}".format(dur)) #輸出/<code>

運行後,分50次輸出程序運營時間。但沒有展示我們需要的進度。改進一下

<code>#文本進度條
import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(51): #循環51次
time.sleep(0.1) #延遲1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
a="*"*i
b="-"*(50-i)
c=(i/50)*100
print("{:.0f}%[{}>{}]用時{:.2f}秒".format(c,a,b,dur)) #輸出/<code>

顯示50行和數據,效果如下,感覺還可以,基本實現,我們預期。

業餘碼農學Python-16:簡單文本進度條製作

  • 第三步:把每一次的進度展示整到一行裡面。50行並一行,單行刷新。

這裡我們採用Python字符串處理中的轉義符“\\r”來使單行打印結束後,光標移回行首,已實現單行數據刷新效果。

<code>#文本進度條
import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(51): #循環51次
time.sleep(0.1) #延遲0.1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
a="*"*i
b="-"*(50-i)
c=(i/50)*100
print("\\r{:.0f}%[{}>{}]用時{:.2f}秒".format(c,a,b,dur),end="") #輸出/<code>

完美展示我們想要的結果:

業餘碼農學Python-16:簡單文本進度條製作

  • 最後我們稍加改進,提示開始,進度條更新,提示結束。
<code>#文本進度條
print("執行開始".center(64,"-"))
import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(51): #循環51次
time.sleep(0.1) #延遲0.1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
a="*"*i
b="-"*(50-i)
c=(i/50)*100
print("\\r{:.0f}%[{}>{}]用時{:.2f}秒".format(c,a,b,dur),end="") #輸出
print("\\n"+"執行結束".center(64,"-"))/<code>

更加完美展示我們想要的結果:

業餘碼農學Python-16:簡單文本進度條製作

最後的成就感

換一個黑白條的展示方式,結果超出我的預期

<code>#文本進度條
print("執行開始".center(63,"-"))
import time #導入time庫
start = time.perf_counter() #計時開始
for i in range(51): #循環51次
time.sleep(0.1) #延遲0.1秒
end = time.perf_counter() #計時結束
dur = end -start #計算時間差
a="■"*i
b="□"*(50-i)
c=(i/50)*100
print("\\r{:.0f}%[{}{}]用時{:.2f}秒".format(c,a,b,dur),end="") #輸出
print("\\n"+"執行結束".center(63,"-"))/<code>
  • 這個結果就是我想要的,我喜歡。成就感滿滿!!
業餘碼農學Python-16:簡單文本進度條製作


【end】


分享到:


相關文章: