【问题标题】:Is there go up line character? (Opposite of \n)有上线人物吗? (与\\n相反)
【发布时间】:2023-02-05 05:09:02
【问题描述】:

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

【问题讨论】:

  • 定义“串行控制台”。这是在 PC 上运行的一些终端仿真程序吗?如果是,是哪一个?
  • FWIW,标准 C++ 中没有任何内容的原因是它支持输出真正是连续剧安慰。像电传打字机什么的。该标准不会沉迷于移动光标等琐碎的事情;-)
  • 我正在使用 PuTTY 来监控 com 端口。
  • 你在什么平台上运行这个?
  • 仅供参考,此处的注释可能对对控制序列感兴趣的人有所帮助 (notes.burke.libbey.me/ansi-escape-codes)。但是随着 colorama 的出现,您可能根本不需要学习它。

标签: python c++ terminal console


【解决方案1】:

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

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

示例(蟒蛇):

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

【讨论】:

  • 这在 PuTTY 中不起作用。但是谢谢你,我相信我会把它用于其他项目。
  • @KeeganMcCarthy:这实际上应该在 PuTTY 中有效,但我不小心漏掉了一个方括号。请再试一次。
  • 我重新阅读了 OPs 问题,你是对的,ANSI 方法将是一种更好的方法并且在这里就足够了。
  • 您可以使用 colorama 包使 [A 序列在 Windows 上工作。
  • 要使用标准库使其在 Windows 上运行,只需运行os.system("")
【解决方案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 库吗? (不争辩,只懂)
  • 诅咒库是很多当然,用途更广。我肯定会将它用于 POSIX 操作系统上的任何文本用户界面。但是,OP 希望在 Windows 上执行一些琐碎的任务(将光标向上移动一行)。如果您可以使用 ANSI 序列,那么为此使用库似乎有些过分,在这种情况下,Windows 上什至不存在该库。
  • @SvenMarnach 啊,好的,我明白你的意思,谢谢你的澄清。我认为我第一句话的后半部分在某种程度上符合我的陈述,但我可以看出它可能不够明确。我相信 OP 可以选择最适合他们的解决方案,有选择是件好事。
【解决方案3】:
for i in range(10):  
    print("Loading" + "." * i) 

    doSomeTimeConsumingProcessing()

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

在 Python 中尝试这个并用任何需要的例程替换 doSomeTimeConsumingProcessing() ,希望它有所帮助

【讨论】:

  • 如果有人想这样做,只需添加 kwarg end=' ' 像这样打印函数:print('Loading', end=' ')
【解决方案4】:

回车可用于转到行首,ANSI 代码ESC A ("[A") 可带您上一行。这适用于 Linux。通过使用 colorama 包启用 ANSI 代码,它可以在 Windows 上运行:

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("
Line 3 the sequel")
time.sleep(1)
print("[ALine 3 the second sequel")
time.sleep(1)
print("[A[A[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

【讨论】:

  • > It can work on Windows by using the colorama package to enable ANSI codes 或者你可以只做os.system("")
【解决方案5】:

我可能错了但是:

#include <windows.h>


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

在 Windows 标准控制台中。

【讨论】:

    【解决方案6】:

    一种基于@Sven Marnach 回答的简单方法:

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

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

    print(f'[A
    xxx{' '* 10}')
    

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2018-08-06
      相关资源
      最近更新 更多