这是我的代码
print("1")
print("2")
我想要的输出
2
1
我尝试使用 ansi 字符,但第二行超过了第一行
print("1")
print("\033[3A2")
输出
2
除了循环之外,如何使用其他方法来反转打印语句的顺序来实现我想要的输出
我更喜欢ansi字符,terminal(),但我也会使用其他方法
您的代码中的问题是“ANSI”代码仍然被认为具有字符,并且在打印/刷新时被解释。
因此,如果您想从 N 行/列移动,您应该首先使用移动指令,然后(并且仅在打印发生时)打印您想要的字符。
至少我通常都是这样做的,而且我从来没有遇到过任何麻烦。
为了达到在顶部打印新行而向下移动现有行的视觉效果,您可以将前面的行保留在列表中,并且在打印新行时,使用
<ESC>[{count}A
代码,然后以相反的顺序打印新行和之前的行。使用 <ESC>[K
代码清除当前光标位置到当前行末尾的内容,以清除较长的上一行中的任何剩余字符:
def reverse_print_factory(print=print):
def _print(line):
if lines:
print(f'\033[{len(lines)}A', end='')
lines.append(line)
for line in reversed(lines):
print(f'{line}\033[K')
lines = []
return _print
print = reverse_print_factory()
print('first')
print('second')
print('third')
这将在 VT100/ANSI 终端上产生以下输出:
third
second
first