【问题标题】:Progress bar prints unwanted characters to the console进度条将不需要的字符打印到控制台
【发布时间】:2020-02-20 20:53:16
【问题描述】:

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

我是新手,我正在尝试在 progressbar2 库的帮助下制作自定义进度条。我的操作系统是 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 符号,而在第二种情况下,它会停留在最右边的位置。

那么,有没有办法解决这个问题,让井号保持丰富多彩和动画,但控制台中没有不需要的 | 字符?

我将不胜感激。

更新:

我能够解决这个问题,用相同的 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】:

    还有一些其他的可能性,但是查看progressbar2的源代码,我发现它的代码和你的例子不匹配,参考这一行:

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

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

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

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

    我希望有一些不那么贪婪的东西,例如,

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

    这样序列的最后一个字符将跟随一个可选参数列表,而不仅仅是任何东西(包括其他转义序列)。

    【讨论】:

    • 感谢您的帮助!我不太确定我是否完全理解您的答案,但我尝试根据您建议的模式测试原始模式,似乎没有区别。这两种模式都从我的填充字符串中完全删除了所有 ANSI 转义序列,只留下一个填充字符#(在我看来这是一种正确的行为)。尽管如此,我还是尝试编辑源代码本身并运行我的脚本。错误仍然存​​在。您提到的其他可能性是什么?
    • 我能够部分修复它。我更新了问题并在 GitHub 上提交了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多