如何为命令行设置动画?

The*_*i.9 79 command-line

我一直想知道人们如何更新命令行中的上一行.一个很好的例子就是在linux中使用wget命令.它会创建一个类似于此的ASCII加载栏:

[======>] 37%

当然,加载条移动并且百分比发生变化,但它不会形成一条新线.我无法弄清楚如何做到这一点.有人能指出我正确的方向吗?

Gre*_*ill 57

一种方法是使用当前进度重复更新文本行.例如:

def status(percent):
    sys.stdout.write("%3d%%\r" % percent)
    sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

请注意,我使用sys.stdout.write而不是print(这是Python),因为print在每行的末尾自动打印"\ r \n"(回车换行).我只想要回车,它将光标返回到行的开头.此外,这flush()是必要的,因为默认情况下,sys.stdout只在换行符之后(或在其缓冲区变满之后)刷新其输出.


haz*_*zen 43

我知道有两种方法可以做到这一点:

  • 使用退格符转义符('\ 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<int>(len * percent)) {
      progress += "=";
    } else {
      progress += " ";
    }
  }
  cout << "[" << progress << "] " << (static_cast<int>(100 * percent)) << "%";
  flush(cout); // Required.
}
Run Code Online (Sandbox Code Playgroud)

  • 假设他在最新版本的Windows(即2000+)上运行Win32控制台应用程序(而不是DOS),ANSI转义码根本不起作用.正如您链接到的维基百科文章中所述. (7认同)

ice*_*nac 17

秘诀是只打印\ r而不是\n或\ r \n在行的和.

\ r被称为回车,它将光标移动到行的开头

\n称为换行,它将光标移动到下一行的控制台中.如果您只使用\ r,则覆盖以前写入的行.所以先写一行如下:

[          ]
Run Code Online (Sandbox Code Playgroud)

然后为每个刻度添加一个符号

\r[=         ]

\r[==        ]

...

\r[==========]
Run Code Online (Sandbox Code Playgroud)

等等.你可以使用10个字符,每个字符代表10%.此外,如果要在完成时显示消息,请不要忘记添加足够的白色字符,以便覆盖以前写入的等号,如下所示:

\r[done      ]
Run Code Online (Sandbox Code Playgroud)