Python: Как сделать progress-bar в консоле?

Давненько у меня возникал вопрос как сделаны прогресс-бары в консольных приложениях и как сделать нечто подобное самому. Но, вопрос никогда не стоял серъёзно, поэтому, максимум — я просто выводил проценты прогресса без каких-либо баров.

Но вот недавно решил нагуглил как это делается. Тут есть 2 пути:

  1. несложный велосипед,
  2. готовое приложение (в данном случае, рассмотрим clint).

Если вы не хотите плодить зависимостей (хотя нужные функции можно легко выдернуть из готового решения), то тут ничего сложного нет: просто печатаем необходимую информацию и пользуемся управляющим символом — «\r», что означает «перевод каретки», т.е. просто возврат курсора на начало строки. Например, так:

Примерно так и работает сам модуль clint (возможности его, кстати, шире чем исключительно рисование прогресс-бара). Если вы выберите всё же готовый вариант, то тут есть несколько решений: обычный прогресс-бар, «точки» на каждую итерацию, либо рисование «мельницы». Варианты использования модуля clint для этих целей:

Установить этот модуль можно через pip, более подробно посмотреть возможные аргументы в исходном коде на github.

Вот пример работы одного модуля с использование бара из clint:

 

Понравилась статья? Поделиться с друзьями:
Комментариев: 3
  1. elisk

    Спасибо…хорошая статья.

  2. Orion

    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) + ‘%’)

  3. Виталий

    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)

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: