用python动态终端打印

Rec*_*ion 38 python terminal

像hellanzb这样的某些应用程序有一种打印到终端的方式,具有动态刷新数据的外观,有点像top().

什么是python中最好的方法呢?我已经阅读了日志和诅咒,但不知道该使用什么.我正在创建一个顶级的重新实现.如果您有任何其他建议,我也向他们开放.

Tor*_*rek 54

最简单的方法是,如果您只需要更新一行(例如,创建进度条),则使用'\r'(回车)和sys.stdout:

import sys
import time

for i in range(10):
    sys.stdout.write("\r{0}>".format("="*i))
    sys.stdout.flush()
    time.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)

如果您需要支持移动指针等的适当控制台UI,请使用curses标准库中的模块:

import time
import curses

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

curses.wrapper(pbar)
Run Code Online (Sandbox Code Playgroud)

最好使用该curses.wrapper功能来调用您的主要功能,它会在发生错误时清理终端,因此之后它不会处于不可用状态.

如果创建更复杂的UI,则可以为屏幕的不同部分,文本输入框和鼠标支持创建多个窗口.


Pet*_*ain 15

正如大多数答案已经说明的那样,你在Linux上真的没有什么选择可以使用ncurses.但是如果你不是在Linux上,或者想要一些更高级别的东西来创建你的终端用户界面怎么办?

我个人发现在Python中缺乏一个现代的,跨平台的终端API令人沮丧,所以写了asciimatics来解决这个问题.它不仅为您提供了一个简单的跨平台API,还为UI小部件和动画提供了许多更高级别的抽象,可以轻松地用于创建类似顶级的UI.


Tej*_*jas 5

我使用 破解了这个脚本curses。这实际上是我为了好玩而做的一个临时解决方案。它不支持滚动,但我认为如果您想在终端上构建具有多行的实时更新监视器,那么它是一个很好的起点。

https://gist.github.com/tpandit/b2bc4f434ee7f5fd890e095e79283aec

这是主要的:

    if __name__ == "__main__":
        stdscr = curses.initscr()
        curses.noecho()
        curses.cbreak()
        curses.start_color()
        curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
        curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
        curses.init_pair(3, curses.COLOR_YELLOW, curses.COLOR_BLACK)
        curses.init_pair(4, curses.COLOR_CYAN, curses.COLOR_BLACK)

        try:
            while True:
                resp = get_data()
                report_progress(get_data())
                time.sleep(60/REQUESTS_PER_MINUTE)
        finally:
            curses.echo()
            curses.nocbreak()
            curses.endwin()
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您使用属性“end”,则无需滚动即可通过 print() 命令将输出发送到终端。

默认为 end='\n' ,这是一个新行。

要抑制滚动并覆盖整个前一行,您可以使用 RETURN 转义符 '\r'。

如果只想重写最后四个字符,可以使用几个退格。

print(value, "_of_", total, end='\r')
Run Code Online (Sandbox Code Playgroud)

注意 这适用于标准系统终端。某些工具(如 IDLE)中的终端仿真器出现错误并且 '\r' 无法正常工作,输出只是与一些不可打印的字符连接在一起。

print() 的额外信息 在上面的示例中,“of”两侧的空格旨在确保我的值和单词“of”之间的空白。但是,print() 的默认分隔符是“”(空格),因此我们最终在“_of_”的值和下划线之间留有空格。

>> print (value, "_of_", total, end='\r')
8 _of_ 17
Run Code Online (Sandbox Code Playgroud)

分隔符属性 sep 可用于设置打印项目之间的字符。在我的示例中,我将其更改为空字符串 ('') 以使我的输出满足我的需要。

>> print (value, "_of_", total, sep='', end='\r')
8_of_17
Run Code Online (Sandbox Code Playgroud)