【问题标题】:Is there go up line character? (Opposite of \n)有上行字符吗? (与\n相反)
【发布时间】:2012-07-13 12:50:02
【问题描述】:

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

【问题讨论】:

  • 定义“串行控制台”。这是在 PC 上运行的一些终端仿真程序,如果是,是哪一个?
  • FWIW,标准 C++ 中没有任何内容的原因是它支持输出真正是 serial 控制台的可能性。比如电传打字机什么的。该标准不会沉迷于移动光标之类的琐事;-)
  • 我正在使用 PuTTY 监控 com 端口。
  • 你在什么平台上运行这个?
  • 现在我正在使用 Windows(这就是我使用 PuTTY 的原因)。但我也在 Linux 上工作,不过还没有在那里测试过。

标签: python c++ terminal console


【解决方案1】:

大多数终端都能理解ANSI escape codes。此用例的相关代码:

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

示例(Python):

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

【讨论】:

  • 这在 PuTTY 中不起作用。但是谢谢你,我相信我会在其他项目中使用它。
  • @KeeganMcCarthy:这实际上应该在 PuTTY 中工作,但我不小心错过了一个方括号。请重试。
  • 我重新阅读了 OPs 的问题,你是对的,ANSI 方法会是更好的方法,在这里就足够了。
  • 嗯,在我的 Konsole bash 终端中不起作用。但是,使用 end='' 打印我的 Python 输出行,然后发出 print("\033[A") 可以,但仅适用于单行。
  • 您可以使用colorama 包使\033[A 序列在Windows 上工作。
【解决方案2】:

不,不是很容易,因为您必须使用类似 curses library 的东西,特别是如果您想更好地控制光标位置并以编程方式做更多事情。

这是Programming with Curses 上 Python 文档的链接,这个简短的 tutorial/example 可能也很有趣。

如果您使用的是 Windows,我刚刚在 docs 中找到了此注释:

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

我相信 C++ 有 NCurses 库,如果你想使用 C++,链接页面有一个关于 moving the cursor 的部分。还有NCurses Programming HowTo

很久之前我用C语言使用curses库相当成功。

更新

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

【讨论】:

  • 我不同意“不,不是很容易,因为你必须使用像 curses 库这样的想法”。您可以使用 ANSI 转义码进行光标放置,它们适用于 Windows 和 POSIX,而且很简单。
  • @SvenMarnach 嗯,好的,请注意。 ANSI 已经存在了很长时间,就像 curses 库一样。我相信 curses 库提供了更好的编程接口(虽然我已经有一段时间没有使用它了)并且可以让你查询各种屏幕参数.. 但是你是说除了不需要 curses 库吗? (不想争论,只是理解)
  • 当然,curses 库的功能很多。我肯定会将它用于 POSIX 操作系统上的任何文本用户界面。但是,OP 想在 Windows 上做一些琐碎的任务(将光标向上移动一行)。如果您可以使用 ANSI 序列,那么为此使用库似乎有点过头了,在这种情况下,该库甚至在 Windows 上都不存在。
  • @SvenMarnach 啊,好的,我明白你的意思了,谢谢你的澄清。我认为我的第一句话的后半部分有点限定了我的陈述,但我可以看到它可能不够明确。我确信 OP 可以选择最适合他们的解决方案,有选择是件好事。
【解决方案3】:
for i in range(10):  
    print("Loading" + "." * i) 

    doSomeTimeConsumingProcessing()

    sys.stdout.write("\033[F") # Cursor up one lin

在 Python 中尝试此操作并将 doSomeTimeConsumingProcessing() 替换为所需的任何例程,希望对您有所帮助

【讨论】:

  • 如果有人想这样做,只需将 kwarg end='\r' 添加到打印功能中,如下所示:print('Loading', end='\r')
【解决方案4】:

我可能错了,但是:

#include <windows.h>


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

在 Windows 标准控制台中。

【讨论】:

    【解决方案5】:

    回车可用于转到行首,ANSI 代码ESC A ("\033[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("\033[ALine 3 the second sequel")
    time.sleep(1)
    print("\033[A\033[A\033[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 可能会使用 SetConsoleMode 启用 Console Virtual Terminal Sequences

    【讨论】:

      猜你喜欢
      • 2023-02-05
      • 1970-01-01
      • 2015-08-06
      • 2021-03-18
      • 2016-06-28
      相关资源
      最近更新 更多