รหัสด้านล่างเป็นคำตอบที่ค่อนข้างทั่วไปและยังมีเวลาที่ผ่านไปและเวลาที่เหลือโดยประมาณ คุณสามารถใช้ iterable ใด ๆ กับมัน แถบความคืบหน้ามีขนาดคงที่ 25 ตัวอักษร แต่สามารถแสดงการอัปเดตในขั้นตอนที่ 1% โดยใช้อักขระเต็มบล็อกครึ่งและสี่ส่วน ผลลัพธ์มีลักษณะดังนี้:
18% |████▌ | \ [0:00:01, 0:00:06]
รหัสด้วยตัวอย่าง:
import sys, time
from numpy import linspace
def ProgressBar(iterObj):
def SecToStr(sec):
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
return u'%d:%02d:%02d'%(h, m, s)
L = len(iterObj)
steps = {int(x):y for x,y in zip(linspace(0, L, min(100,L), endpoint=False),
linspace(0, 100, min(100,L), endpoint=False))}
qSteps = ['', u'\u258E', u'\u258C', u'\u258A'] # quarter and half block chars
startT = time.time()
timeStr = ' [0:00:00, -:--:--]'
activity = [' -',' \\',' |',' /']
for nn,item in enumerate(iterObj):
if nn in steps:
done = u'\u2588'*int(steps[nn]/4.0)+qSteps[int(steps[nn]%4)]
todo = ' '*(25-len(done))
barStr = u'%4d%% |%s%s|'%(steps[nn], done, todo)
if nn>0:
endT = time.time()
timeStr = ' [%s, %s]'%(SecToStr(endT-startT),
SecToStr((endT-startT)*(L/float(nn)-1)))
sys.stdout.write('\r'+barStr+activity[nn%4]+timeStr); sys.stdout.flush()
yield item
barStr = u'%4d%% |%s|'%(100, u'\u2588'*25)
timeStr = ' [%s, 0:00:00]\n'%(SecToStr(time.time()-startT))
sys.stdout.write('\r'+barStr+timeStr); sys.stdout.flush()
# Example
s = ''
for c in ProgressBar(list('Disassemble and reassemble this string')):
time.sleep(0.2)
s += c
print(s)
คำแนะนำสำหรับการปรับปรุงหรือความคิดเห็นอื่น ๆ ที่ชื่นชม ไชโย!