【问题标题】:Display text in terminal that is update-able with function [duplicate]在终端中显示可通过功能更新的文本[重复]
【发布时间】:2021-08-27 02:56:00
【问题描述】:

我已经在网上搜索了一段时间,但我仍然不知道如何在可通过功能更新的终端中显示文本。 (我说的是 Linux 中的应用程序安装进度条更新它所显示的内容)

是否可以在终端中制作一行文本,可以使用 Python 中的函数进行更新?

提前致谢

【问题讨论】:

  • 来自文档,“curses 库为基于文本的终端提供了一个独立于终端的屏幕绘制和键盘处理工具”。它为您提供全屏,您可以使用文本在其上“绘图”。不过,在命令上显示进度条可能是另一回事。
  • 例如,我指的是文本如何更新,而不是它如何显示进度条。很抱歉造成混乱!
  • 我找到了一个更简单的方法, print("\rText", end="") 然后 print("\rText 2", end="") 也可以

标签: python python-3.x


【解决方案1】:

tqdm 可能是一个不错的选择,如果您不是在寻找可定制和基本的东西。

例如(在documentation 中给出),您可以这样做:

from tqdm import tqdm
for i in tqdm(range(10000)):
    ...

它会在终端中输出一个进度条,看起来像:

76%|████████████████████████████         | 7568/10000 [00:33<00:10, 229.00it/s]

【讨论】:

  • 例如,我指的是文本如何更新,而不是它如何显示进度条。很抱歉造成混乱!
【解决方案2】:

如果您只使用一行代码,则很容易自行推出。 Chr(8)(退格)将光标向后移动一个空格。跟踪您在一行上打印了多少个字符,不要在末尾打印换行符,并打印足够的退格符以返回到您想要打印新文本的位置。如果新文本比已经存在的文本短,请打印足够的空格以擦除多余的内容。唯一真正的技巧是确保刷新输出,否则在打印换行符之前它不会显示。 (从 Python 3.3 开始,print() 函数上有一个 flush 参数,这很容易。)

这是一个小演示...我的目标是为Line 制作类似于 API 的东西,但实际上没有时间正确地完成它。不过,也许你可以从这里拿走它......

import time
from io import StringIO

class Line():
    def __init__(self):
        self.value = ""
    def __call__(self, *args, start=0, sep=" "):
        chars = 0
        io = StringIO()
        print(*args, file=io, end="", sep=sep)
        text = io.getvalue()
        self.value = (self.value[:start] + " " * (start - len(self.value))
                      + text + self.value[start + len(text):])
        print(self.value, chr(8) * len(self.value), sep="", end="", flush=True)
    def __next__(self):
        self.value = ""
        print()

def greet():
    line = Line()
    line("hello", start=2)
    time.sleep(1)
    line("world", start=8)
    time.sleep(1)
    line("hi   ", start=2)
    time.sleep(1)
    line("world ", start=7)
    time.sleep(0.3)
    line("world ", start=6)
    time.sleep(0.3)
    line("world ", start=5)
    time.sleep(1)
    line("globe", start=5)
    time.sleep(1)
    for _ in range(4):
        for c in "! ":
            line(c, start=10)
            time.sleep(0.3)
    line("!", start=10)
    time.sleep(1)
    next(line)

greet()

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 2014-02-23
    • 2020-07-25
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2021-06-05
    相关资源
    最近更新 更多