在控制台中重写多行

2024-04-23 09:52:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道可以始终用“\r”重写终端中显示的最后一行,但我很难确定是否有方法返回并编辑控制台中打印的前几行

我想做的是为一个基于文本的RPG重印多行,然而,一个朋友也在想,对于一个应用程序,它有一行专门用于进度条,另一行描述下载

即控制台将打印:

Moving file: NameOfFile.txt  
Total Progress: [########              ] 40%

然后在程序运行时适当地更新(两行)


Tags: 方法进度条文本txt应用程序终端编辑朋友
3条回答

最终,如果您想要操纵屏幕,您需要使用底层操作系统库,这些库通常是:

  • Linux或OSX上的curses(或terminfo/termcap数据库跟踪的底层终端控制代码)
  • Windows上的win32控制台API

如果你不介意只使用一个操作系统或者乐意在Windows上安装第三方库,那么@codeape的答案已经为你提供了许多选择

但是,如果您想要一个可以简单地pip安装的跨平台解决方案,可以使用asciimatics。作为开发这个包的一部分,我必须解决环境之间的差异,以提供一个在Linux、OSX和Windows上工作的API

对于进度条,可以使用this code使用this demo中所示的条形图对象

在Unix上,使用curses模块

在Windows上,有几个选项:

使用诅咒的简单示例(我是total curses n00b):

import curses
import time

def report_progress(filename, progress):
    """progress: 0-10"""
    stdscr.addstr(0, 0, "Moving file: {0}".format(filename))
    stdscr.addstr(1, 0, "Total progress: [{1:10}] {0}%".format(progress * 10, "#" * progress))
    stdscr.refresh()

if __name__ == "__main__":
    stdscr = curses.initscr()
    curses.noecho()
    curses.cbreak()

    try:
        for i in range(10):
            report_progress("file_{0}.txt".format(i), i+1)
            time.sleep(0.5)
    finally:
        curses.echo()
        curses.nocbreak()
        curses.endwin()

这里是一个用于Python 2/3的Python模块,只需几行代码即可解决这种情况;D

reprint - A simple module for Python 2/3 to print and refresh multi line output contents in terminal

您可以简单地将output实例视为正常的dictlist(取决于您使用的模式)。当您在output实例中修改该内容时,终端中的输出将自动刷新:D

根据您的需要,以下是代码:

from reprint import output
import time

if __name__ == "__main__":
    with output(output_type='dict') as output_lines:
        for i in range(10):
            output_lines['Moving file'] = "File_{}".format(i)
            for progress in range(100):
                output_lines['Total Progress'] = "[{done}{padding}] {percent}%".format(
                    done = "#" * int(progress/10),
                    padding = " " * (10 - int(progress/10)),
                    percent = progress
                    )
                time.sleep(0.05)

相关问题 更多 >