【问题标题】:Python control output positions in terminal/consolePython 控制终端/控制台中的输出位置
【发布时间】:2016-07-08 10:36:55
【问题描述】:

这是python语言的问题,终端/控制台适用于类Unix系统。如果解决方案独立于平台但不是必需的,那就太好了。

这种情况是程序不断向终端打印行。但是,在要打印的许多行中,有一些是特殊的,例如进度条或状态指示器:它们只能放在控制台底部,而所有其他行仍然可以打印在它们通常所在的位置,一个接一个另一个,屏幕也正常滚动。

示例代码解决方案比理论上的解决方案要好得多。为此,这里有一个例子:

def print_status(msg):
  # implement me
  print msg

def print_many_lines():
  print 'line one\n'
  print 'line two\n'
  print_status('i am here')
  print 'line three\n'
  print 'line four\n'
  print 'line five\n'
  print_status('i am changed')
  print 'line six\n'

您能帮我实现 print_status 函数,以便传递给它的 msg 将始终打印在终端底部吗?

请注意,这与another similar question 非常不同,即当多行连续 打印到终端时,我们如何确保它们打印在同一行。在这种情况下使用 \r 可能很有用,但它不能解决这个问题,因为(1)这些特殊行可能更可能不会连续打印,并且(2)在这些特殊行之后会打印其他行,但这些特殊行应该是保持在终端的底部,仍然。

谢谢!

【问题讨论】:

  • 我在发布这个问题之前已经看到了这个问题。不它不是。请注意,我不只是希望所有输出连续时都打印在同一行,而是这些输出是随机顺序的。
  • 你看过 ncurses 吗?
  • 还没有,但似乎有点矫枉过正......

标签: python


【解决方案1】:

对于 Windows 终端,试试 console module 对于 unix,curses module 可以。

这就是您在 Windows 上的操作方式。

c = Console.getconsole()
c.text(0, -1, 'And this is the string at the bottom of the console')

通过为第二个参数指定-1,字符串位于最后一行。

对于 Linux,在最后一行打印的工作代码。

import time
import curses

def pbar(window):
    height, width = window.getmaxyx()
    for i in range(10):
        window.addstr(height -1, 0, "[" + ("=" * i) + ">" + (" " * (10 - i )) + "]")
        window.refresh()
        time.sleep(0.5)

curses.wrapper(pbar)

【讨论】:

  • 能否提供curses模块的示例代码来完成这项工作?这个问题专门针对类 Unix 系统。
  • 这次看起来好多了。但是,在您的 pbar 函数中,传入了一个 Window 对象。如果我理解正确,在我提供的代码场景中,我必须先初始化一个窗口,然后再执行任何操作?看起来curses只能在窗口初始化后才能初始化。
  • 我对curses了解不多,但似乎curses打开了一个新窗口并在上面打印字符串。
  • 我认为现在说得通了。如果不使用窗口对象来控制整个屏幕,在屏幕底部打印可能会导致程序终止后出现问题。例如,如果只有几行打印出来,并且它们远离底部有一行状态,那么在终止后控制台提示应该是什么。从逻辑上讲,它应该在屏幕底部之后并自动滚动一行,但是……并不是那么神奇。我会尝试一下,如果一切正常,我会接受答案。
  • 是的,如果卡住了,请检查文档docs.python.org/2/library/curses.html
【解决方案2】:

听起来你想使用一个 curses 库,它在 Unix 系统上处理基于文本的 UI。在 python 的标准库中有一个模块:

https://docs.python.org/2/library/curses.html#module-curses

恐怕如何使用它超出了这里的答案范围。

【讨论】:

  • 我也看到了这个。但是我没有找到将输出放在终端底部并移回原处的方法。我现在怀疑这是否能完成这项工作,所以我要求提供一个提供示例代码的解决方案。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 2011-01-21
  • 2019-09-12
  • 2018-05-26
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多