我正在玩 itertools.cycle,我使用一个简单的列表作为输入。然后我写了一个 while 循环,我想在遍历它们时基本上用每种颜色覆盖我的输出。 sys.stdout.write('\r' + colors) 行不会覆盖所有字符,只会覆盖下一个颜色的字符串的长度。最后,我在每次迭代之间有 0.5 秒的延迟。
import itertools
import time
colors = ['green', 'yellow', 'red']
traffic_light = itertools.cycle(colors)
while True:
sys.stdout.write('\r' + next(traffic_light))
sys.stdout.flush()
time.sleep(.5)
当我在循环中达到“黄色”时,当打印较短的“绿色”和“红色”字符串时,我会留下“w”或“低”。我的输出看起来像这样(在打印“黄色”的第一个循环之后)。
redlow
greenw
yellow
我可以用 '\r' 回车完全覆盖输出吗?
请您参考如下方法:
回车 '\r' 会将光标发送到行首,它可以覆盖现有文本。您可以将其与序列 CSI K 结合使用,后者从当前光标删除到行尾。
只需将 \r 替换为 \r\x1b[K。参见 ANSI escape code .
import itertools
import sys
import time
colors = ['green', 'yellow', 'red']
traffic_light = itertools.cycle(colors)
while True:
sys.stdout.write('\r\x1b[K' + next(traffic_light))
sys.stdout.flush()
time.sleep(.5)
试试这些额外的转义序列:
# Add color
colors = ['\x1b[32mgreen', '\x1b[33myellow', '\x1b[31mred']
请注意此技术的局限性...如果终端足够短以致于您的文本换行,程序将在您每次打印时向前移动一行。如果您需要更强大的东西,curses为您提供更多功能,但在 Windows 上无法立即使用。
