import os
import time
h = 0
s = 0
m = 0
while s <= 60:
os.system('clear')
print h, "hours", m, 'minutes', s, 'seconds'
time.sleep(1)
s += 1
if s == 60:
m += 1
s = 0
elif m == 60:
h += 1
m = 0
s = 0
我上面有这段代码。一切正常,并且按预期进行,但我想这样做,以便它在同一行中打印所有语句。例如,它应该打印出 0 小时 0 分 0 秒,然后在同一行上打印出 0 小时 0 分 1 秒,第二个变量是唯一发生变化的变量。我该怎么做呢?我已经尝试使用 os.system('clear') 命令,但它不起作用。我在 Mac OSX 10.7 上运行它。
您应该使用终端提供的内容。在大多数情况下,您需要使用'\r'
(回车,返回到该行的第一列);但根据操作系统的不同,这可能会被解释为它还会附加一个换行符。我觉得我记得 OSX 可能会这样做。
您还需要避免自动换行 print
将始终附加。您可以为此使用尾随逗号,但这有问题(杂散空间,不刷新)。所以我建议改用 sys.stdout.write()
并且因为没有换行符通常不会进行刷新,所以你应该明确地使用 sys.stdout.flush()
然后,返回到第一列不会删除旧的输出,所以它只会被下一行覆盖。如果它比之前的短,你就会有拖尾垃圾。为避免这种情况,请再次使用您的终端提供的内容(通常 '\x1b[K'
会在不移动光标的情况下删除行尾之前的所有内容,但如果这对您不起作用,请打印一些空格或确保您的输出格式始终为相同的宽度)。
EL = '\x1b[K' # clear to end of line
CR = '\r' # carriage return
sys.stdout.write(("%d hours %d minutes %s seconds" + EL + CR) % (h, m, s))
sys.stdout.flush()
一个更合适的方法(除了使用文字序列的快捷方式之外)是使用官方的 curses 库。
import curses
curses.setupterm()
EL = curses.tigetstr('el')
CR = curses.tigetstr('cr')
如果 CR 真的不能像我们希望的那样在 OSX 上运行,那么您的 termcaps 中可能有 goto 以转到特定位置(例如第一列),或者您可以使用 save_cursor
(SC) 和 restore_cursor
(RC) 恢复之前保存的位置:
sys.stdout.write(SC + "%d hours %d minutes %s seconds" + EL + RC % (h, m, s))