Давненько у меня возникал вопрос как сделаны прогресс-бары в консольных приложениях и как сделать нечто подобное самому. Но, вопрос никогда не стоял серъёзно, поэтому, максимум — я просто выводил проценты прогресса без каких-либо баров.
Но вот недавно решил нагуглил как это делается. Тут есть 2 пути:
- несложный велосипед,
- готовое приложение (в данном случае, рассмотрим clint).
Если вы не хотите плодить зависимостей (хотя нужные функции можно легко выдернуть из готового решения), то тут ничего сложного нет: просто печатаем необходимую информацию и пользуемся управляющим символом — «\r», что означает «перевод каретки», т.е. просто возврат курсора на начало строки. Например, так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import sys import time def show_progress(value): sys.stderr.write('%d\r' % value) for i in xrange(10): show_progress(i) time.sleep(.1) |
Примерно так и работает сам модуль clint (возможности его, кстати, шире чем исключительно рисование прогресс-бара). Если вы выберите всё же готовый вариант, то тут есть несколько решений: обычный прогресс-бар, «точки» на каждую итерацию, либо рисование «мельницы». Варианты использования модуля clint для этих целей:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import time from clint.textui import progress if __name__ == '__main__': for i in progress.bar(range(10)): sleep(.1) for i in progress.dots(range(10)): sleep(.1) for i in progress.mill(range(10)): sleep(0.1) |
Установить этот модуль можно через pip, более подробно посмотреть возможные аргументы в исходном коде на github.
Вот пример работы одного модуля с использование бара из clint:
1 2 3 | $ python main.py some output here... [############ ] 79/200 |
Спасибо…хорошая статья.
Progress: [===========================================] 100%
def show_progress(value):
length = 60
percentage = value
value = value*length/100
sys.stderr.write(‘\rProgress: [‘ + ’33[1;33m=’*value + ‘ ‘*(length-value)
+ ’33[1;32m] ‘ + str(percentage) + ‘%’)
import sys
def show_progress(setMax, setVal):
# Всего процентов
precent_max = setMax
# Текущее количество процентов
precent_cur = int(setVal / setMax * 100)
# Это 100% прогресс бара
length_pb = 60
# Вычислить текущее значение прогресса
length_cur = int(length_pb / 100 * precent_cur)
# Выводим прогресс бар
sys.stderr.write(‘\rProgress: [‘+
‘#’*length_cur+’.’*(length_pb-length_cur)+
‘] ‘+str(precent_cur)+’%’)
if __name__ == ‘__main__’:
from time import sleep
for i in range(1,256):
setMax = len(range(1,255))
show_progress(setMax, i)
sleep(.1)