2010-08-15 86 views
18

我有一个Python脚本,我想让它在终端中显示一个从0到100%的递增数字。我知道如何在终端上打印数字,但我怎么能“重写”它们,所以0变成1,1,变成2,依此类推直到100?如何在终端重写输出

回答

23

打印回车(\r)不换行重置光标移到行的开头,使得下一个打印覆盖什么已经印刷:

import time 
import sys 
for i in range(100): 
    print i, 
    sys.stdout.flush() 
    time.sleep(1) 
    print "\r", 

这不会清除线,因此,如果您尝试使用此方法打印减少的数字,您会看到之前打印的剩余文字。您可以通过用空格填充输出或使用其他答案中的某些控制代码来解决此问题。

+3

是这个平台独立吗? – 2010-08-15 18:53:21

+9

@ klez:可能不适用于所有终端。它适用于打字机。那个平台对你来说足够独立吗? :) – 2010-08-15 19:08:39

+2

在我可以使用的两个平台(Linux和Windows)上,它可以工作。 – 2010-08-15 19:08:40

5

这个配方here应该证明是有用的。使用该模块作为TC,下面的代码你想要做什么:

from tc import TerminalController 
from time import sleep 
import sys 

term = TerminalController() 

for i in range(10): 
    sys.stdout.write("%3d" % i) 
    sys.stdout.flush() 
    sleep(2) 
    sys.stdout.write(term.BOL + term.CLEAR_EOL) 

配方使用terminfo获取有关终端信息,并在Linux和OS X适用于多个终端。不过,它在Windows上不起作用。 (感谢piquadrat进行测试,根据下面的评论)。

编辑:该配方还提供了使用颜色和重写部分线条的功能。它还有一个现成的文本进度条。

+3

的要求,我在想你的代码Windows(Windows 7,Python 2.7)。输出是“0 1 2 3 4 5 6 7 8 9”。 – 2010-08-15 19:24:55

+0

@piquadrat:非常感谢。 – 2010-08-15 19:53:38

+0

这工作,但它是矫枉过正。 – vy32 2011-02-15 02:46:15

0

基于this answer,但没有终端控制器:

import time 
import sys 
for i in range(100): 
    sys.stdout.write("Downloading ... %s%%\r" % (i)) 
    sys.stdout.flush() 
    time.sleep(1) 

测试GNOME终端(Linux)或视窗控制台上。

提示:不要在IDLE编辑器中运行此示例。

2

使用blessings package - 清除屏幕(清/ CLS),然后输入:

import sys 
from blessings import Terminal 
from time import sleep # <- boy, does this sound tempting a.t.m. 

term = Terminal() 
for i in range(6): 
    with term.location(term.width - 3, term.height - 3):   
     print('{}'.format(i)) 
    sleep(2) 
    if (i == 3): 
     print('what was I doing, again?') 
print('done') 

从Cheeseshop上安装它,只是......

pip install blessings