如何将光标移动到第一行上方而不超过它

问题描述 投票:0回答:2

这是我的代码

print("1")
print("2")

我想要的输出

2
1

我尝试使用 ansi 字符,但第二行超过了第一行


print("1")
print("\033[3A2")  

输出

2

除了循环之外,如何使用其他方法来反转打印语句的顺序来实现我想要的输出

我更喜欢ansi字符,terminal(),但我也会使用其他方法

python terminal ncurses ansi
2个回答
0
投票

您的代码中的问题是“ANSI”代码仍然被认为具有字符,并且在打印/刷新时被解释。

因此,如果您想从 N 行/列移动,您应该首先使用移动指令,然后(并且仅在打印发生时)打印您想要的字符。

至少我通常都是这样做的,而且我从来没有遇到过任何麻烦。


0
投票

为了达到在顶部打印新行而向下移动现有行的视觉效果,您可以将前面的行保留在列表中,并且在打印新行时,使用

<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
© www.soinside.com 2019 - 2024. All rights reserved.