进度栏会将不需要的字符打印到控制台上

问题描述 投票:1回答:1

我知道这个主题听起来很模糊,我会尽力解释。

我是新手,我正在尝试借助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,您可以看到在更新井号和哈希符号被窃听后的动画时,光标在控制台中留下了一些蓝色的|字符。但是,如果我保持哈希符号为无色,则一切看起来都很好(请参见0:35)。

您还可以看到,在第一种情况下,光标每次更新时都会跳转到hast符号,在第二种情况下,光标停留在最右侧。

因此,有一种方法可以解决此问题,以使井号保持彩色和动画效果,但控制台中没有多余的|字符?

我将不胜感激。

UPDATE:

我能够解决这个问题,用相同的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上提交问题。

python terminal progress-bar stdout ansi-escape
1个回答
0
投票

还有其他可能性,但是在查看progressbar2的源代码时,我发现它的代码与您的示例不匹配,请参考此行:

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

no_color中,此模式与给定的值匹配:

no_color

这可能是您的示例的问题,该示例使用两次出现的转义序列(并使其错误地计算了字符串可打印部分的长度)。

例如,我希望没有贪心的东西

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

以便该序列的最后一个字符将出现在可选参数列表之后,而不仅仅是任何内容(包括其他转义序列)。

© www.soinside.com 2019 - 2024. All rights reserved.