如何在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处理。你试过独立脚本吗?