【问题标题】:How to refresh multiple printed lines inplace using Python?如何使用 Python 就地刷新多条打印行?
【发布时间】:2016-08-29 12:10:20
【问题描述】:

我想了解如何在 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 参数,我希望有一个更简单的解决方案。

【问题讨论】:

  • 不确定您要做什么?请提供一个示例控制台输出
  • 已更新,希望现在更清楚,如果没有请告诉我
  • 所以它实际上是您要更新的一行?
  • 我正在尝试更新语句中的所有行
  • 好的,所以你试图只重新打印已更改的行,动态屏幕刷新??使用默认的 python IDE,据我所知这是不可能的。有办法伪造它,买它看起来不会那么流畅。

标签: python python-3.x printing stdout


【解决方案1】:

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

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

【讨论】:

  • 这只有在他在终端工作时才有效。如果他使用 IDLE 或其他解释器怎么办?
  • 此解决方案不可移植
  • 是的@BPL,您的答案更便携:) 尽管不推荐使用注释os.system
  • @Chris_Rands 已弃用?我不知道……不过,docs 中没有标记,你在哪里读到的?
  • @BPL 它在您链接到的文档中说使用subprocess 模块优于os.system,另请参阅:docs.python.org/3/library/subprocess.html
【解决方案2】:

如果我理解正确,您正在寻找这种类型的解决方案:

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”之类的字符串写入输出缓冲区。本机命令提示符可以将此解释为清除屏幕的命令,但这些伪终端不知道如何解释它,因此它们最终只会打印小方块,就像打印未知字符一样。

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

【讨论】:

  • 这只有在他在终端工作时才有效。如果他使用 IDLE 或其他解释器怎么办?
  • 不错的复制粘贴!
  • @TheLazyScripter 在使用 python 多年后,我从未使用过那个 IDLE 的东西,所以我个人并不关心它。此外,OP 没有提到这个要求,所以假设他正在使用一些真正的工具
  • @BPL 我使用 Eclipse,但您的方法不起作用。我没有指定它不能在 IDLE 中工作,我是说它只能在 CMD 或其他终端上工作......
【解决方案3】:

您可以为此使用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()

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 2014-03-26
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多