From a239690854705df3485eb39fd8875b7b6a24b2a1 Mon Sep 17 00:00:00 2001 From: Tom <2063944+TomHodson@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:24:01 +0100 Subject: [PATCH] add progress bar post --- ...23-06-22-tqdm_and_printing_in_notebooks.md | 30 ++++++++++++++++++ assets/blog/progress_bars/bar.png | Bin 0 -> 19433 bytes 2 files changed, 30 insertions(+) create mode 100644 _posts/2023-06-22-tqdm_and_printing_in_notebooks.md create mode 100644 assets/blog/progress_bars/bar.png diff --git a/_posts/2023-06-22-tqdm_and_printing_in_notebooks.md b/_posts/2023-06-22-tqdm_and_printing_in_notebooks.md new file mode 100644 index 0000000..9ae78a6 --- /dev/null +++ b/_posts/2023-06-22-tqdm_and_printing_in_notebooks.md @@ -0,0 +1,30 @@ +--- +title: Progress bars and log output in Jupyter notebooks +excerpt: +layout: post +image: /assets/blog/progress_bars/bar.png +alt: An image of a nice animated progress bar in a jupyter notebook output cell. +--- +I wanted to have just one updateable line of output that would play nicely with a tqdm progress bar. After playing around with `print(s, end="\r")` I settled on using `Ipython.display` with a handle. The problem with the print approach is that it doesn't work when the output is shorter than the previous line. + +```python +import time +import random +from tqdm.auto import tqdm +from IPython.display import display, Markdown + +info_line = display(Markdown(''), display_id=True) + +for x in tqdm(range(0,5), position = 0): + for y in tqdm(range(0,5), position = 1, leave=False): + x = random.randint(1, 10) + b = "Loading" + "." * x + info_line.update(Markdown(b)) + time.sleep(0.5) +``` +
+ +
+What it looks like in the end. +
+
\ No newline at end of file diff --git a/assets/blog/progress_bars/bar.png b/assets/blog/progress_bars/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..86f99fd7c483a88fc7b3d51628c467a0e969d105 GIT binary patch literal 19433 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 literal 0 HcmV?d00001