如何在Python中使用for循环覆盖带有回车符的行?

如何在Python中使用for循环覆盖带有回车符的行?,python,loops,carriage-return,Python,Loops,Carriage Return,我试图用end=\r打印一个字符串,将光标发送回行的开头,并使用for循环覆盖打印的字符串 这是迄今为止我得到的代码: import time print("░░░░░░░░░░░░░", end='\r') for i in ("SECRET"): print(i ,end='') time.sleep(0.3) 理想情况下,它应该每隔0.3秒用“SECRET”中的字符慢慢覆盖一些虚线模式字符 但是,当运行时,for循环将在单个空格上

我试图用
end=\r
打印一个字符串,将光标发送回行的开头,并使用for循环覆盖打印的字符串

这是迄今为止我得到的代码:

import time

print("░░░░░░░░░░░░░", end='\r')
for i in ("SECRET"):
    print(i ,end='')
    time.sleep(0.3)
理想情况下,它应该每隔0.3秒用“SECRET”中的字符慢慢覆盖一些虚线模式字符

但是,当运行时,for循环将在单个空格上迭代和打印字符,覆盖它自己打印的字符,而不是前进到下一个可用空格,覆盖那里的点模式,并在它迭代的字符串中键入其余字符

删除与虚线模式字符关联的整个print语句可以使循环正常工作,正确打印出它迭代的字符串,但是,循环需要打印出字符串并覆盖虚线字符

本质上,我希望在的帮助下,使用for循环迭代的字符串中的字符逐个覆盖一些虚线模式字符\r\n

我在Ubuntu Studio上

屏幕输出是行缓冲的。这意味着当你打印一个新行后,它会立即出现在屏幕上,但是如果你打印一个没有新行的东西,它可能需要一段时间才会出现

这就是发生在您身上的情况——for循环中的输出后面没有换行符,因此它不会立即出现在屏幕上

您可以将
flush=True
添加到打印调用,以强制立即显示输出,而不是等待:

print(i, end='', flush=True)

在python中不能覆盖字符。 不过,您可以在windows上使用
os.system('cls')
或在linux和unix上使用
os.system('clear')
来清除整个屏幕。 以下是完整的代码:

import time, os

output = '░░░░░░░░░░░░░'
for i in range(7):
    print(output)
    output = "SECRET"[:i]+output[i:]
    time.sleep(0.3)
    if os.name == 'nt': #on windows
       os.system("cls")
    else:
       os.system("clear") #not on windows
print(output)

另外,这只在您没有从shell运行时才起作用,如果您想看到完整的输出,请在末尾写入
time.sleep(1)

flush=True
添加到
print(i,end='')
。您使用的是什么操作系统?@RobinDeSchepper我正在使用Ubuntu studio非常奇怪,您使用的标准终端在
.bashrc
和其他修改方面没有太多的特殊功能吗?@RobinDeSchepper您指的是我运行代码的IDE吗?如果是这样的话,我正在使用Thonny idefor循环,即使在添加flush=True之后,for循环仍然会在相同的空格字符上继续打印其迭代的字符串?添加
flush=True
是Linux上的原因和解决方案,但不是原始问题中描述的问题。在Linux上,直到循环结束(从而程序退出和缓冲区刷新)之后才会出现任何东西@RobinDeSchepper我决定完全删除time.sleep()进行测试,并对代码进行了两次测试。一次没有刷新,一次代码中有刷新。两者都有效。似乎是时候了。sleep()是罪魁祸首,但我不确定它为什么会导致这个问题。我需要时间。sleep()在输出中,所以我不能删除它。你不能在python中覆盖字符什么?当然可以。打印退格字符将使光标向左移动一个空格,打印回车将使光标一直向左移动。在我的python shell中,退格打印一个方框,回车对我来说没有任何意义,
print(“aaa\b\b\bccc”)
在python shell中以
ccc
作为唯一显示的字符。我并不奇怪回车不做任何事情,因为shell自己进行行I/O处理。你试过独立脚本吗?