我知道这个主题听起来很模糊,我会尽力解释。
我是新手,我正在尝试借助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上提交问题。
还有其他可能性,但是在查看progressbar2的源代码时,我发现它的代码与您的示例不匹配,请参考此行:
progressbar.ProgressBar(widgets=[f'{V}{text}{END}', progressbar.Percentage(),
在no_color
中,此模式与给定的值匹配:
no_color
这可能是您的示例的问题,该示例使用两次出现的转义序列(并使其错误地计算了字符串可打印部分的长度)。
例如,我希望没有贪心的东西
pattern = '\\\u001b\\[.*?[@-~]'
以便该序列的最后一个字符将出现在可选参数列表之后,而不仅仅是任何内容(包括其他转义序列)。