我目前正在编写一个非常简单的终端工具,我想实现以下行为。
终端应显示:
Downloading "Something" ...
完成下载后,我想用以下内容替换该行:
Downloading "Something" [Done]
我已经看到这样做了o创建以下动画:
[-]
[\]
[|]
[/]
由于我对终端工具没有太多经验,我不知道如何实现这个简单的行为。任何帮助将不胜感激。
答案 0 :(得分:3)
使用退格符 - \b
。
不要忘记刷新输出流,它可能是缓冲的。
答案 1 :(得分:3)
使用“\ r \ n”终止该行的中间版本。任何后续写入都将覆盖该行(只要新写入至少与原始写入一样长。)
不久前有a similar question;有关C ++中的代码,请参阅my answer there。
答案 2 :(得分:2)
如果它是ANSI终端,您可以使用ANSI Escape Sequences将光标移回一行或任何其他位置。然后,您可以从光标所在的位置开始编辑。
答案 3 :(得分:2)
试试这个:
void test() {
const char *msg = "Downloading %s%s";
printf(msg, "file", "...\r");
printf(msg, "file", "[Done]\n");
}
使用“\ r”(CR)来实现神奇的技巧:P。
答案 4 :(得分:2)
虽然使用'\b'
删除python中的先前值并不困难(查看this question的答案)。我建议您使用python-progressbar:
from progressbar import ProgressBar, RotatingMarker
import time
widgets = ['Downloading something... [', RotatingMarker(), ']']
maxval = 10
progressbar = ProgressBar(widgets=widgets, maxval=maxval).start()
for i in range(maxval):
progressbar.update(i)
# Do something
time.sleep(0.2)
widgets[-2] = 'Done'
progressbar.finish()
原因不仅在于您可以轻松地执行您正在寻找的内容,而且还可以添加其他小部件(ETA,FileTransferSpeed,Percentage,...),如果您希望以后使进度条看起来像根据您的需求更好。