I have a Python script which takes a long time to run. I'd quite like to have the command line output to have a little 'waiting' animation, much like the swirly circle we get in browsers for AJAX requests. Something like an output of a '\', then this is replaced by a '|', then '/', then '-', '|', etc, like the text is going round in circles. I am not sure how to replace the previous printed text in Python.
Use \r
and print-without-newline (that is, suffix with a comma):
animation = "|/-\\"
idx = 0
while thing_not_complete():
print(animation[idx % len(animation)], end="\r")
idx += 1
time.sleep(0.1)
For Python 2, use this print
syntax:
print animation[idx % len(animation)] + "\r",
Just another pretty variant
import time
bar = [
" [= ]",
" [ = ]",
" [ = ]",
" [ = ]",
" [ = ]",
" [ =]",
" [ = ]",
" [ = ]",
" [ = ]",
" [ = ]",
]
i = 0
while True:
print(bar[i % len(bar)], end="\r")
time.sleep(.2)
i += 1
A loading bar useful for if you're installing something.
animation = [
"[ ]",
"[= ]",
"[=== ]",
"[==== ]",
"[===== ]",
"[====== ]",
"[======= ]",
"[========]",
"[ =======]",
"[ ======]",
"[ =====]",
"[ ====]",
"[ ===]",
"[ ==]",
"[ =]",
"[ ]",
"[ ]"
]
notcomplete = True
i = 0
while notcomplete:
print(animation[i % len(animation)], end='\r')
time.sleep(.1)
i += 1
if you want to make it last a couple seconds do
if i == 17*10:
break
after the
i += 1
I think for best practices you can put a if condition at the end of the loop to avoid overflow with 'idx' variable in the case where the waiting funtion last longer than expexted:
import time
animation_sequence = "|/-\\"
idx = 0
while True:
print(animation_sequence[idx % len(animation_sequence)], end="\r")
idx += 1
time.sleep(0.1)
if idx == len(animation_sequence):
idx = 0
# Verify the change in idx variable
print(f' idx: {idx}', end='\r')
I liked the aesthetic of @Warren and built upon it to allow a personalization.
import time
# User Specification
bar = '========'
width = 8
bar_length = len( bar )
total_width = width + 2 * bar_length
t0 = time.time()
idx = 0
while time.time()-t0<30:
string = f'{idx * " " + bar: <{total_width }}'
substring = string[bar_length:bar_length+width]
print(f'[{substring}]', end='\r')
idx = (idx + 1) % total_width
time.sleep(0.1)
This approach saves the need to specify each 'frame' of the loading bar and allows you to replace bar
with anything you want to see flying across the screen.
Python's built-in curses package contains utilities for controlling what is printed to a terminal screen.
© 2022 - 2024 — McMap. All rights reserved.