有上行字符吗?(与n相反)

Is there go up line character? (Opposite of )

本文关键字:相反 字符      更新时间:2023-10-16

我想在串行控制台中覆盖上面一行的内容。有没有一个角色可以让我向上移动?

大多数终端都理解ANSI转义码。此用例的相关代码:

  • "33[F"–将光标移动到前一行的开头
  • "33[A"–将光标上移一行

示例(Python):

print("33[FMy text overwriting the previous line.")

不,不是很容易,因为你必须使用curses库之类的东西,尤其是如果你想更好地控制光标的位置并用程序做更多的事情。

这里有一个关于用诅咒编程的Python文档的链接,这个简短的教程/示例可能也很有趣。

我刚刚在文档中发现了这条注释,以防您使用Windows:

没有人创建curses模块的Windows端口。在Windows上平台,请尝试Fredrik Lundh编写的Console模块。控制台模块提供光标可寻址的文本输出,并完全支持鼠标和键盘输入,可从http://effbot.org/zone/console-index.htm.

我相信对于C++来说,有NCurses库,如果你想用C++四处走动,链接页面上有一个关于移动光标的部分。还有NCurses编程的HowTo。

Long很久以前,我非常成功地将curses库与C结合使用。

更新

我错过了在终端/串行上运行这一部分,因为ANSI转义序列,尤其是对于像你这样的简单任务,将是最简单的,我同意@SvenManach的解决方案。

for i in range(10):  
    print("Loading" + "." * i) 
    doSomeTimeConsumingProcessing()
    sys.stdout.write("33[F") # Cursor up one lin

在Python中尝试一下,用所需的任何例程替换doSomeTimeConsumingProcessing(),并希望它能帮助

Carriage回车可以用于行首,ANSI代码ESC A"33[A")可以带您上行。这适用于Linux。它可以在Windows上使用colorama包来启用ANSI代码:

import time
import sys
import colorama
colorama.init()
print("Line 1")
time.sleep(1)
print("Line 2")
time.sleep(1)
print("Line 3 (no eol)", end="")
sys.stdout.flush()
time.sleep(1)
print("rLine 3 the sequel")
time.sleep(1)
print("33[ALine 3 the second sequel")
time.sleep(1)
print("33[A33[A33[ALine 1 the sequel")
time.sleep(1)
print()  # skip two lines so that lines 2 and 3 don't get overwritten by the next console prompt
print()

输出:

> python3 multiline.py
Line 1 the sequel
Line 2
Line 3 the second sequel
>

在引擎盖下,colorama可能会启用控制台虚拟终端序列使用CCD_ 6。

我可能错了,但:

#include <windows.h>

void gotoxy ( int column, int line )
{
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(
    GetStdHandle( STD_OUTPUT_HANDLE ),
    coord
    );
}

在windows标准控制台中。

一个基于@Sven Marnach答案的简单方法:

print(f'33[Arxxx')
  • 33[A:将光标向上移动一行
  • r:将光标移动到行的开头
  • xxx:要打印的字符串。{xxx}(如果是变量)

如果字符串后面的前一行有一些额外字符,请根据前一行的长度用空格覆盖它们。下面我添加了10个空格。

print(f'33[Arxxx{' '* 10}')