Индикатор выполнения выводит нежелательные символы на консоль

Я знаю, что тема звучит довольно расплывчато, я постараюсь объяснить.

Я новичок и пытаюсь создать собственный индикатор выполнения с помощью библиотеки progressbar2. Моя ОС — Windows 10, мой терминал — стандартная командная строка, и я использую Python 3.8.1.

Я взял пример заполняющегося анимированного индикатора выполнения из официальной документации и попытался немного изменить его, чтобы сделать его красочным, используя escape-символы ANSI. Вот мой код:

    """
    Displays a fancy progress bar.

    :param text: Progress bar text
    :return: Progress bar object
    """
    V = '\033[38;5;31m'
    END = '\033[0m'
    bar = \
        progressbar.ProgressBar(widgets=[f'{V}{text}{END}', progressbar.Percentage(),
        progressbar.Bar(marker=progressbar.AnimatedMarker(fill=f'{V}#{END}'))])
    return bar

Но когда я это делаю, я наблюдаю странный побочный эффект. Я сделал короткий скринкаст, чтобы было проще понять: https://youtu.be/p_YpkbJrTa8

В 0:05 вы можете видеть, что курсор оставляет несколько синих символов | в консоли при обновлении строки и анимации после знака решетки. Однако, если я оставлю решетку бесцветной, все будет выглядеть нормально (см. 0:35).

Вы также можете видеть, что в первом случае курсор переходит на знак hast при каждом обновлении, а во втором случае он остается в крайнем правом положении.

Итак, есть ли способ исправить это, чтобы решетка оставалась красочной и анимированной, но в консоли не было нежелательных символов |?

Буду признателен за любую помощь.

ОБНОВЛЕНИЕ:

Я смог исправить это, обернув маркеры, составляющие анимацию, с теми же цветовыми кодами ANSI.

   V = '\033[38;5;31m'
   END = '\033[0m'
   bar = \
        progressbar.ProgressBar(widgets=[f'{V}{text}{END}', progressbar.Percentage(),
        progressbar.Bar(marker=progressbar.AnimatedMarker(markers=f'{V}|/-\\{END}', 
                                                          fill=f'{V}#{END}'))])
    return bar

Теперь символ | остается в крайнем правом положении, где ему и место, но анимация все еще прерывается. Я сделал еще один скринкаст, чтобы продемонстрировать, что: https://youtu.be/t2YwlBQxcN0

Похоже, отсутствует символ дефиса, и иногда анимированный маркер становится бесцветным (см. 0:09 и особенно 0:21). Я попытаюсь зарегистрировать проблему на GitHub.


person Klavionik    schedule 20.02.2020    source источник


Ответы (1)


Есть и другие возможности, но глядя на источник progressbar2, я вижу несоответствие между его кодом и вашим примером, ссылаясь на эту строку:

progressbar.ProgressBar(widgets=[f'{V}{text}{END}', progressbar.Percentage(),

В no_color этот шаблон сопоставляется с приведенные значения:

pattern = '\\\u001b\\[.*?[@-~]'

Это было бы проблемой с вашим примером, который использует два вхождения escape-последовательности (и заставит его неправильно вычислить длину печатной части строки).

Я бы ожидал чего-то менее жадного, например,

pattern = '\\\u001b\\[[0-9;:]*[@-~]'

чтобы последний символ последовательности следовал за необязательным списком параметров, а не за чем-либо (включая другие escape-последовательности).

person Thomas Dickey    schedule 22.02.2020
comment
Спасибо за вашу помощь! Я не совсем уверен, что полностью понимаю ваш ответ, но я попытался сравнить исходный шаблон с тем, который вы предложили, и похоже, что это не имеет значения. Оба шаблона полностью удаляют все escape-последовательности ANSI из моей строки заполнения, оставляя только один символ заполнения # (что мне кажется правильным поведением). Тем не менее, я попытался отредактировать сам исходный код и запустить свой скрипт. Баг остается. Какие еще возможности вы упомянули? - person Klavionik; 22.02.2020
comment
Мне удалось частично исправить. Я обновил вопрос и зарегистрировал проблему на GitHub. - person Klavionik; 22.02.2020