如何使用 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——用for循环删除列表中的元素

python中for循环的用法

Python如何实现for循环递减(i--)

Python如何实现for循环递减(i--)

Python中的枚举对象有什么用?怎样用内置函数enumerate()得到枚举对象?Python的for循环和C++的for循环有何区别?Python中for循环的本质是什么?

怎样在shell上写python一行写循环