Answer a question

The below question is for people who use PyCharm. There are nested for loops and tqdm is used for progress bars corresponding to each for loop. The code is shown below.

from tqdm import tqdm
import time

for i in tqdm(range(5), desc="i", colour='green'):
    for j in tqdm(range(10), desc="j", colour='red'):
        time.sleep(0.5)

But the problem is, the progress bars for the inner loop appear in newline everytime there is an update in the bar as shown below.

i:   0%|          | 0/5 [00:00<?, ?it/s]
j:   0%|          | 0/10 [00:00<?, ?it/s]
j:  10%|█         | 1/10 [00:00<00:04,  1.94it/s]
j:  20%|██        | 2/10 [00:01<00:04,  1.94it/s]
j:  30%|███       | 3/10 [00:01<00:03,  1.96it/s]
j:  40%|████      | 4/10 [00:02<00:03,  1.96it/s]
j:  50%|█████     | 5/10 [00:02<00:02,  1.97it/s]
j:  60%|██████    | 6/10 [00:03<00:02,  1.97it/s]
j:  70%|███████   | 7/10 [00:03<00:01,  1.97it/s]
j:  80%|████████  | 8/10 [00:04<00:01,  1.98it/s]
j:  90%|█████████ | 9/10 [00:04<00:00,  1.98it/s]
j: 100%|██████████| 10/10 [00:05<00:00,  1.98it/s]
i:  20%|██        | 1/5 [00:05<00:20,  5.06s/it]
j:   0%|          | 0/10 [00:00<?, ?it/s]
j:  10%|█         | 1/10 [00:00<00:04,  2.00it/s]
j:  20%|██        | 2/10 [00:01<00:04,  1.99it/s]
j:  30%|███       | 3/10 [00:01<00:03,  1.99it/s]
j:  40%|████      | 4/10 [00:02<00:03,  1.99it/s]
j:  50%|█████     | 5/10 [00:02<00:02,  1.99it/s]
j:  60%|██████    | 6/10 [00:03<00:02,  1.99it/s]
j:  70%|███████   | 7/10 [00:03<00:01,  1.99it/s]
j:  80%|████████  | 8/10 [00:04<00:01,  1.99it/s]
j:  90%|█████████ | 9/10 [00:04<00:00,  1.99it/s]
j: 100%|██████████| 10/10 [00:05<00:00,  1.99it/s]
i:  40%|████      | 2/5 [00:10<00:15,  5.05s/it]

Setting the parameter 'position` for each loop also doesn't fix the issue.

from tqdm import tqdm
import time

for i in tqdm(range(5), desc="i", colour='green', position=0):
    for j in tqdm(range(10), desc="j", colour='red', position=1):
        time.sleep(0.5)

How does one get the progress bar to update in the same line?

Answers

The solution is two fold.

  1. Go to "Edit configurations". Click on the run/debug configuration that is being used. There should be an option "Emulate terminal in output console". Check that. Image added for reference. enter image description here

  2. Along with the position argument also set the leave argument. The code should look like this. I have added ncols so that the progress bar doesn't take up whole of the console.

from tqdm import tqdm
import time

for i in tqdm(range(5), position=0, desc="i", leave=False, colour='green', ncols=80):
    for j in tqdm(range(10), position=1, desc="j", leave=False, colour='red', ncols=80):
        time.sleep(0.5)

When the code is now run, the output of the console is as shown below.

i:  20%|████████▍                                 | 1/5 [00:05<00:20,  5.10s/it]
j:  60%|████████████████████████▌                | 6/10 [00:03<00:02,  1.95it/s]

The updates happen on the same line.

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐