parent
6cf8578d06
commit
ddf16578b3
@ -0,0 +1,72 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
ANSI_RGB = "\033[38;2;{};{};{}m"
|
||||||
|
ANSI_RGB_BG = "\033[48;2;{};{};{}m"
|
||||||
|
ANSI_RESET = "\033[0m"
|
||||||
|
|
||||||
|
RAINBOW_COLORS = [
|
||||||
|
(255, 0, 0),
|
||||||
|
(255, 127, 0),
|
||||||
|
(255, 255, 0),
|
||||||
|
(127, 255, 0),
|
||||||
|
(0, 255, 0),
|
||||||
|
(0, 255, 127),
|
||||||
|
(0, 255, 255),
|
||||||
|
(0, 127, 255),
|
||||||
|
(0, 0, 255),
|
||||||
|
(127, 0, 255),
|
||||||
|
(255, 0, 255),
|
||||||
|
(255, 0, 127),
|
||||||
|
]
|
||||||
|
|
||||||
|
def rgb_interpolate(start, end, progress):
|
||||||
|
return tuple(int(start[i] + (end[i] - start[i]) * progress) for i in range(3))
|
||||||
|
|
||||||
|
# take a value from 0 to 1 and return an interpolated color from the rainbow
|
||||||
|
def rainbow_at_position(progress):
|
||||||
|
idx_a = int(progress * float(len(RAINBOW_COLORS) - 1))
|
||||||
|
idx_b = idx_a + 1
|
||||||
|
return rgb_interpolate(RAINBOW_COLORS[idx_a], RAINBOW_COLORS[idx_b], progress * float(len(RAINBOW_COLORS) - 1) - idx_a)
|
||||||
|
|
||||||
|
def print_progress_bar(progress = 0.0):
|
||||||
|
sys.stdout.write("\r")
|
||||||
|
progress_bar_contents = ""
|
||||||
|
PROGRESS_LENGTH = 30
|
||||||
|
full_block = '█'
|
||||||
|
blocks = [ '▉', '▊', '▋', '▌', '▍', '▎', '▏']
|
||||||
|
block_values = [0.875, 0.75, 0.625, 0.5, 0.375, 0.25, 0.125]
|
||||||
|
rainbow_colors = [
|
||||||
|
(255, 0, 0),
|
||||||
|
(255, 127, 0),
|
||||||
|
(255, 255, 0),
|
||||||
|
(127, 255, 0),
|
||||||
|
(0, 255, 0),
|
||||||
|
(0, 255, 127),
|
||||||
|
(0, 255, 255),
|
||||||
|
(0, 127, 255),
|
||||||
|
(0, 0, 255),
|
||||||
|
(127, 0, 255),
|
||||||
|
(255, 0, 255),
|
||||||
|
(255, 0, 127),
|
||||||
|
|
||||||
|
]
|
||||||
|
for i in range(PROGRESS_LENGTH):
|
||||||
|
interpolated = rainbow_at_position(i / PROGRESS_LENGTH)
|
||||||
|
# check if should print a full block
|
||||||
|
if i < int(progress * PROGRESS_LENGTH):
|
||||||
|
interpolated_2nd_half = rainbow_at_position((i + 0.5) / PROGRESS_LENGTH)
|
||||||
|
progress_bar_contents += ANSI_RGB.format(*interpolated)
|
||||||
|
progress_bar_contents += ANSI_RGB_BG.format(*interpolated_2nd_half)
|
||||||
|
progress_bar_contents += "▌"
|
||||||
|
# check if should print a non-full block
|
||||||
|
elif i < int((progress * PROGRESS_LENGTH) + 0.5):
|
||||||
|
progress_bar_contents += ANSI_RESET
|
||||||
|
progress_bar_contents += ANSI_RGB.format(*interpolated)
|
||||||
|
progress_bar_contents += blocks[int((progress * PROGRESS_LENGTH) + 0.5) - i - 1]
|
||||||
|
# otherwise, print a space
|
||||||
|
else:
|
||||||
|
progress_bar_contents += ANSI_RESET
|
||||||
|
progress_bar_contents += ' '
|
||||||
|
progress_bar_contents += ANSI_RESET
|
||||||
|
sys.stdout.write("[{}] {:.1f}%".format(progress_bar_contents, progress * 100))
|
||||||
|
sys.stdout.flush()
|
Loading…
Reference in new issue