我一直想知道人们如何更新命令行中的上一行.一个很好的例子就是在linux中使用wget命令.它会创建一个类似于此的ASCII加载栏:
[======>] 37%
当然,加载条移动并且百分比发生变化,但它不会形成一条新线.我无法弄清楚如何做到这一点.有人能指出我正确的方向吗?
一种方法是使用当前进度重复更新文本行.例如:
def status(percent): sys.stdout.write("%3d%%\r" % percent) sys.stdout.flush()
请注意,我使用sys.stdout.write
而不是print
(这是Python),因为print
在每行的末尾自动打印"\ r \n"(回车换行).我只想要回车,它将光标返回到行的开头.此外,这flush()
是必要的,因为默认情况下,sys.stdout
只在换行符之后(或在其缓冲区变满之后)刷新其输出.
我知道有两种方法可以做到这一点:
使用退格符转义符('\ b')删除您的行
curses
如果您选择的编程语言具有绑定,请使用该包.
谷歌发布了ANSI逃逸代码,这似乎是一个好方法.作为参考,这是C++中的一个函数来执行此操作:
void DrawProgressBar(int len, double percent) { cout << "\x1B[2K"; // Erase the entire current line. cout << "\x1B[0E"; // Move to the beginning of the current line. string progress; for (int i = 0; i < len; ++i) { if (i < static_cast(len * percent)) { progress += "="; } else { progress += " "; } } cout << "[" << progress << "] " << (static_cast (100 * percent)) << "%"; flush(cout); // Required. }
秘诀是只打印\ r而不是\n或\ r \n在行的和.
\ r被称为回车,它将光标移动到行的开头
\n称为换行,它将光标移动到下一行的控制台中.如果您只使用\ r,则覆盖以前写入的行.所以先写一行如下:
[ ]
然后为每个刻度添加一个符号
\r[= ] \r[== ] ... \r[==========]
等等.你可以使用10个字符,每个字符代表10%.此外,如果要在完成时显示消息,请不要忘记添加足够的白色字符,以便覆盖以前写入的等号,如下所示:
\r[done ]