如何使用 Python 就地刷新多行打印?

How to refresh multiple printed lines inplace using Python?

我想了解如何在 Python 3.5.

中转载多行

这是一个脚本示例,我想在其中刷新打印的语句。

import random
import time

a = 0
while True:
    statement = """
    Line {}
    Line {}
    Line {}
    Value = {}
    """.format(random.random(), random.random(), random.random(), a)
    print(statement, end='\r')
    time.sleep(1)
    a += 1

我想做的是:

Line 1
Line 2
Line 3
Value = 1

写在/更新/刷新之上:

Line 1
Line 2
Line 3
Value = 0

每一行的值每次都会改变。这有效地为我提供了每条线路的状态更新。

我看到了 another question from 5 years ago 但是在 Python 3+ 打印函数中添加了 end 参数,我希望有一个更简单的解决方案。

如果每次调用print()都想清屏,让出现打印每次都被覆盖,可以使用clear 在 unix 中或 cls 在 windows 中,例如:

import subprocess
a = 0
while True:
    print(a)
    a += 1
    subprocess.call("clear")

如果我没理解错的话,您正在寻找此类解决方案:

import random
import time
import os


def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

a = 0
while True:
    clear_screen()

    statement = """
    Line {}
    Line {}
    Line {}
    Value = {}
    """.format(random.random(), random.random(), random.random(), a)
    print(statement, end='\r')
    time.sleep(1)
    a += 1

此解决方案不适用于 IDLE、Sublime Text、Eclipse 等软件...运行 它在此类软件中的问题是 clear/cls 使用 ANSI 转义序列来清除屏幕。这些命令将诸如“\033[[80;j”之类的字符串写入输出缓冲区。本机命令提示符能够将其解释为清除屏幕的命令,但这些伪终端不知道如何解释它,所以它们最终只是打印小方块,就像打印未知字符一样。

如果您使用的是这种类型的软件,可以使用 print('\n' * 100),这不是最佳解决方案,但总比没有好。

您可以使用 curses

#!/usr/bin/python3

import curses
from time import sleep
from random import random

statement = """
Line {}
Line {}
Line {}
Value = {}"""

screen = curses.initscr()
n = 0

while n < 20:
    screen.clear()
    screen.addstr(0, 0, statement.format(random(), random(), random(), n))
    screen.refresh()
    n += 1
    sleep(0.5)

curses.endwin()