我一直想知道人们是如何更新命令行中的前一行的。在linux中使用wget命令就是一个很好的例子。它创建了一个ASCII加载栏,如下所示:
======> 37%
当然,加载条会移动,百分比也会发生变化,但不会产生新的线。我想不出该怎么做。谁能给我指个方向?
发布于 2008-09-13 00:56:00
我知道有两种方法可以做到这一点:
curses
包。谷歌还透露了ANSI Escape Codes,这似乎是一个很好的方式。作为参考,下面是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<int>(len * percent)) {
progress += "=";
} else {
progress += " ";
}
}
cout << "[" << progress << "] " << (static_cast<int>(100 * percent)) << "%";
flush(cout); // Required.
}
发布于 2008-09-13 00:58:24
要做到这一点,一种方法是使用当前进度重复更新文本行。例如:
def status(percent):
sys.stdout.write("%3d%%\r" % percent)
sys.stdout.flush()
请注意,我使用的是sys.stdout.write
而不是print
(这是Python),因为print
会自动在每行的末尾打印"\r\n“(回车换行符)。我只需要回车符,它将光标返回到行首。此外,flush()
也是必需的,因为在默认情况下,sys.stdout
仅在换行符之后(或缓冲区满后)才刷新其输出。
发布于 2014-10-06 23:04:36
秘诀是只打印\r,而不是在和行尾打印\n或\r\n。
\r称为回车符,它在行首移动光标
\n称为换行符,它将光标移动到控制台中的下一行。如果仅使用\r,则会覆盖之前写入的行。因此,首先编写一行代码,如下所示:
[ ]
然后为每个刻度添加一个符号
\r[= ]
\r[== ]
...
\r[==========]
诸若此类。您可以使用10个字符,每个字符代表10%。此外,如果您想在完成后显示一条消息,请不要忘记添加足够的白色字符,以便覆盖之前编写的等号,如下所示:
\r[done ]
https://stackoverflow.com/questions/60221
复制相似问题