使用多个条形图

39

我希望有两个独立的进度条。

以下是一个简单的示例,如果我使用两个进度条,它们将无法正确更新。相反,会创建新的进度条。

import time
from tqdm import *

pbar1 = tqdm(total=100)
pbar2 = tqdm(total=200)

for i in range(10):
    pbar1.update(10)
    pbar2.update(20)
    time.sleep(1)

运行示例时,我会得到类似于:

  0%|          | 0/100 [00:00<?, ?it/s]
 20%|██        | 20/100 [00:01<00:04, 19.97it/s]
 30%|███       | 30/100 [00:02<00:04, 15.36it/s]
 40%|████      | 40/100 [00:03<00:04, 13.23it/s]
 50%|█████     | 50/100 [00:04<00:04, 12.05it/s]
 60%|██████    | 60/100 [00:05<00:03, 11.35it/s]
 70%|███████   | 70/100 [00:06<00:02, 10.90it/s]
 80%|████████  | 80/100 [00:07<00:01, 10.61it/s]
 90%|█████████ | 90/100 [00:08<00:00, 10.42it/s]
100%|██████████| 100/100 [00:09<00:00, 10.28it/s]
100%|██████████| 200/200 [00:09<00:00, 20.57it/s]

如图所示,更新不起作用,会添加新的条形图。 是否可能拥有两个独立的条形图,能够正确地进行更新?


对于所有使用Windows的用户,请参见我的答案中的另一个线程。简短版本:按照tqdm已知问题中所述,安装colorama包:pip install colorama - Nebulo
2个回答

56

在初始化条形图时,尝试使用position参数:

pbar1 = tqdm(total=100, position=1)
pbar2 = tqdm(total=200, position=0)

来自tqdm GitHub页面

position:int,可选

指定要打印此进度条的行偏移量(从0开始)。如果未指定,则自动设置。有助于同时管理多个进度条(例如,来自线程)。


12
这对我并没有解决问题:“from tqdm import tqdm; def c(): for _ in tqdm([1, 2, 3, 4, 5], position=0): for _ in tqdm([1, 2, 3, 4], position=1): pass” 在IDLE中运行,仍然产生多行输出。我使用的是Python 3.6.8版本。 - Antoine
1
也遇到了tqdm_notebook的问题。 - Roelant
3
但在这种情况下,您会在第一次循环的每个迭代中创建一个新的tqdm进度条。如果您有两个独立的循环,例如2个线程/进程,那么此解决方案将起作用,这样每个进度条只创建一次。 - Sylvain

8

这里有一些嵌套进度条的例子,tqdm的一些示例以及我通常遇到的问题;其中我强调以下代码片段,它会产生两个漂亮的嵌套进度条

def test48():
  with tqdm.notebook.trange(3, position=0, desc='Outter') as outter_range:
    for i in outter_range:
      leave = i == len(outter_range) - 1
      for _ in tqdm.notebook.trange(3, position=1, leave=leave, desc='Inner'):
        sleep(.3)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接