Python打印保持在同一行 导入操作系统 导入时间 h=0 s=0 m=0 当s

Python打印保持在同一行 导入操作系统 导入时间 h=0 s=0 m=0 当s,python,macos,Python,Macos,时,尝试以下方法: 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

时,尝试以下方法:

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

你还应该看看阿尔夫的答案:-)

你应该使用你的终端提供的东西。在大多数情况下,您需要使用
'\r'
(回车,返回到该行的第一列);但根据操作系统的不同,这可能会被解释为它还附加了一个换行符。我觉得我记得OSX可能会这样做

此外,您还需要避免自动换行
print
将始终追加。您可以使用尾随逗号,但这会有问题(游离空间,无刷新)。因此,我建议改用
sys.stdout.write()
,因为没有换行符通常不会进行刷新,所以也应该显式地使用
sys.stdout.flush()

然后,返回到第一列不会删除旧的输出,因此它只会被下一行覆盖。如果比之前的短,您将有尾随垃圾。为了避免这种情况,请再次使用终端提供的内容(通常情况下,
'\x1b[K'
会在不移动光标的情况下擦除所有内容,直到行尾,但如果这对您不起作用,只需打印一些空格或确保输出的格式始终相同)

一个更体面的方法(除了使用文字序列的快捷方式)是使用官方的诅咒库

如果CR真的不能像我们希望的那样在OSX上工作,那么您的termcaps中可能会转到一个特定位置(例如第一列),或者您可以使用
保存光标
(SC)和
恢复光标
(RC)来恢复先前保存的位置:

import curses
curses.setupterm()
EL = curses.tigetstr('el')
CR = curses.tigetstr('cr')

在Python 3中,可以使用以下代码:

sys.stdout.write(SC + "%d hours %d minutes %s seconds" + EL + RC % (h, m, s))

在“\r”之后添加逗号,以便下次打印将转到同一行此答案还有其他问题。仅使用
“\r”
将在下一次输出中添加一个多余的空格,并且不会刷新输出。如果旧行比新行长,也可能出现尾随垃圾。有关如何避免此情况的详细信息,请参阅我的答案。可能的重复这是一个很好的回答,已经寻找了一段时间了。
import curses
curses.setupterm()
EL = curses.tigetstr('el')
CR = curses.tigetstr('cr')
sys.stdout.write(SC + "%d hours %d minutes %s seconds" + EL + RC % (h, m, s))
print("{} hours, {} minutes, {} seconds".format(h, m, s), end = "\r")