TQM打印到newlin

2024-05-16 02:06:27 发布

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

我正在用python编写一个小的命令行游戏,其中我使用tqdm模块显示了一个进度条。我使用msvcrt模块监听用户输入,以中断进程。一旦中断,用户可以通过在命令行提示符中输入“restart”来重新启动。第二次显示进度条时,它不是用进度更新同一行,而是每次创建一个新行。

我怎么才能让它显示同一条线上的进展呢?

Progress bar issue

这段代码演示了我对进度条的使用。

def transfer():
    for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format='{l_bar}{bar}|'):
        sleep(.1)
        if msvcrt.kbhit():
            if msvcrt.getwche() == ' ':
                interrupt()
                break

def interrupt():
    type("File transfer interrupted, to restart the transfer, type 'restart'")

Tags: 模块进度条命令行用户游戏if进程def
3条回答
from tqdm import tqdm_notebook

这个命令在google colab中有效。

尝试使用tqdm.tqdm.write代替标准print()

这将打印在进度条上方,并将进度条移动到下方一行。

我使用下面的代码对此进行了测试,按space将打印到stdout中,但不会中断循环。 还不完全清楚您要实现什么,因为您的interrupt()函数只检查提供的字符串的类型。type() built-in function

import tqdm
import msvcrt
from time import sleep

def transfer():
    for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format='{l_bar}{bar}|'):
        sleep(.1)
        if msvcrt.kbhit():
            if msvcrt.getwche() == ' ':
                interrupt()
                # break

def interrupt():
    tqdm.tqdm.write("File transfer interrupted, to restart the transfer, type 'restart'", end="")

transfer()

编辑:包括Paul Netherwood指出的tqdm.write()end参数 tqdm.tqdm.write()

尝试使用position=0leave=True

(解决方案在Google Colab中工作以避免打印到换行符)

from tqdm import tqdm 
import time

def foo_():
    time.sleep(0.3)
range_ = range(0, 10)
total = len(range_)

with tqdm(total=total, position=0, leave=True) as pbar:
   for i in tqdm((foo_, range_ ), position=0, leave=True):
    pbar.update()

相关问题 更多 >