Индикатор выполнения выводит ненужные символы на консоль - PullRequest
1 голос
/ 20 февраля 2020

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

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

Я взял пример заполнения анимированного индикатора выполнения из официальных документов и попытался немного измените его, чтобы сделать его цветным, используя управляющие символы 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 видно, что курсор оставляет несколько синих | символы в консоли при обновлении панели и анимации после появления знака ha sh. Однако, если я оставлю знак ha sh бесцветным, все выглядит отлично (см. 0: 35 ).

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

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

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

ОБНОВЛЕНИЕ:

Мне удалось это исправить оборачивая маркеры, составляющие анимацию, в те же цветовые коды 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.

1 Ответ

0 голосов
/ 22 февраля 2020

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

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

В no_color, он сопоставляет этот шаблон с указанными значениями:

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

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

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

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

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

...