如何使用 Python 中的 for 循环用回车覆盖一行?
Posted
技术标签:
【中文标题】如何使用 Python 中的 for 循环用回车覆盖一行?【英文标题】:How to overwrite a line with carriage return, using a for-loop in Python? 【发布时间】:2020-09-13 19:00:02 【问题描述】:我正在尝试使用end=\r
打印出一个字符串以将光标发送回行首,并使用 for 循环覆盖打印的字符串
这是我目前得到的代码:
import time
print("░░░░░░░░░░░░░", end='\r')
for i in ("SECRET"):
print(i ,end='')
time.sleep(0.3)
理想情况下,它应该每隔 0.3 秒慢慢地用 `"SECRET" 中的字符覆盖一些虚线字符。
但是,当运行时,for 循环会迭代并在单个空格上打印字符,覆盖它自己打印出来的字符,而不是前进到下一个可用空间,覆盖那里的点图案并在其中键入剩余的字符它迭代的字符串
删除与虚线字符关联的整个打印语句允许循环正常运行,打印出它正确迭代的字符串,但是,循环需要打印出字符串并覆盖虚线字符
本质上,我想在 \r
的帮助下,使用 for 循环迭代的字符串中的字符一个一个地覆盖一些点模式字符我在 Ubuntu Studio 上
【问题讨论】:
将flush=True
添加到print(i, end='')
。
你使用的是什么操作系统?
@RobinDeSchepper 我正在使用 Ubuntu Studio
很奇怪,在.bashrc
等修改方面,你是用的标准终端没有太多特长吗?
@RobinDeSchepper 您指的是我运行代码的 IDE 吗?如果是这样,我正在使用 Thonny IDE
【参考方案1】:
屏幕输出是行缓冲。这意味着当您打印某些内容后跟换行符时,它会立即出现在屏幕上,但如果您打印的内容没有换行符,则可能需要一段时间才能出现。
这就是发生在你身上的事情 - for 循环内的输出后面没有换行符,因此它不会立即出现在屏幕上。
您可以在 print 调用中添加 flush=True
以强制输出立即出现而不是等待:
print(i, end='', flush=True)
【讨论】:
即使在添加了 flush=True 之后,for 循环仍会继续在相同的空格字符上打印其迭代的字符串? 添加flush=True
是Linux上的原因和解决方案,但不是原始问题中描述的问题。在 Linux 上,直到循环之后才会出现任何内容(因此程序退出和缓冲区刷新)
@RobinDeSchepper 我决定通过完全删除 time.sleep() 进行测试,并测试了两次代码。一次没有刷新,一次在代码中刷新。两者都有效。似乎 time.sleep() 是罪魁祸首,但我不确定它为什么会导致这个问题。我需要 time.sleep() 在输出中,所以我也不能删除它【参考方案2】:
你不能在 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)
。
【讨论】:
python 中不能覆盖字符 什么?你当然可以。打印退格字符会将光标向左移动一格,打印回车会将光标一直向左移动。完成这些操作后,您就可以打印新字符来替换行上的现有字符。 在我的 python shell 中,退格打印一个框,回车没有任何作用 对我来说,python shell 中的print("aaa\b\b\bccc")
以ccc
作为唯一显示的字符。我对回车没有任何作用并不感到惊讶,因为 shell 自己处理行 I/O。您是否从独立脚本中尝试过?以上是关于如何使用 Python 中的 for 循环用回车覆盖一行?的主要内容,如果未能解决你的问题,请参考以下文章
Python中的枚举对象有什么用?怎样用内置函数enumerate()得到枚举对象?Python的for循环和C++的for循环有何区别?Python中for循环的本质是什么?