Skip to main content

Elegant, customizable progress bars and spinners for Python — in both terminal and Jupyter notebook environments!

Project description

image

ProgressivePy

Elegant, customizable progress bars and spinners for Python — in both terminal and Jupyter notebook environments!


Features

  • Highly customizable: Colors, styles, templates, and more.
  • Terminal & Notebook support: Works seamlessly in scripts, CLI, and Jupyter/IPython.
  • Nested & parallel bars: Track multiple tasks at once.
  • Spinners: Animated indicators for indeterminate tasks.
  • Low dependencies: Lightweight and easy to install.
  • Thread management: Run multiple bars/spinners concurrently.

Installation from Git

pip install git+https://github.com/Ansari-Codes/progressive_py.git

Quick Start

Terminal Progress Bar

from progressive_py.progress_bar import simple, time

for i in simple(range(100), txt_lf="Processing {iters} "):
    time.sleep(0.1)

Styled Progress Bar

from progressive_py.manager import AssetsManager
from progressive_py.progress_bar import simple, time
mgr = AssetsManager()
theme = mgr.load('progress_bar', 'theme', 'neon_wave')
style = mgr.load('progress_bar', 'style', 'its_cool')
for i in simple(range(100),
                dict(     # pass theme seperatly as dict, its safer
                    **theme,
                    **style
                ),
                head = '>', # change parameters of passed dict before
                txt_lf='You\'re being hacked... {percent:.0f}% |',
                txt_rt='| ETA: {eta} | Elapsed: {elapsed}'
                ):
    time.sleep(0.05)

Terminal Spinner

from progressive_py import spinner
import time
from progressive_py.manager import AssetsManager

mgr = AssetsManager()
style = mgr.load('spinner', 'style', 'dots')
theme = mgr.load('spinner', 'theme', 'sunset')
spinner = spinner.Spinner(seq=style, spn_side='left', text=' Loadings ', **theme)

spinner.start()
time.sleep(2)
spinner.stop()

Notebook Progress Bar

from progressive_py.ntbk_progbar import NotebookProgressBar
from progressive_py.utils import gradient_colors
from progressive_py.manager import AssetsManager
import time
style = AssetsManager().load('progress_bar', 'style', 'its_cool')
pb = NotebookProgressBar({
    **style,
    'txt_lf': "I'm Fast... [{percent:.0f}%] | ",
    'txt_rt': "| ETA {eta} | Elapsed {elapsed}",
    'colors': gradient_colors('#00ff00', '#0000ff', 15),
    'paint': 'bar-by-bar',
    'text_color': ['#efa', '#afe'],
    'length': 15,
})

total = 100
for i in range(total + 1):
    pb.update(i/ total, i, total)
    time.sleep(0.03)
print("Progress Complete!")

Notebook Spinner

from progressive_py.ntbk_spinner import NotebookDivSpinner
import time

spn = NotebookDivSpinner({"text": "Loading"})
spn.start()
time.sleep(2)
spn.stop()

Style Spinner

from progressive_py.ntbk_spinner import NotebookDivSpinner
import time

spinner = NotebookDivSpinner(
    text="Loading...",
    final_text="Done!",
    speed=1.2,
    refresh=0.1,
    fg_text=["#2afadf", "#00c9ff", "#ff0080", "#7928ca"],
    bg_text=["#111111", "#222222", "#333333"],
    clr_interval=[0.4],
    container_css={
        "box-shadow": "0 4px 12px rgba(0, 0, 0, 0.25)",
        "background": "#1a1a1a",
        "border-radius": "10px",
        "padding": "6px 14px",
        "gap": "10px",
        "display": "inline-flex",
        "align-items": "center",
        "margin": "0px",  # No top margin
        "max-width": "fit-content"
    },
    spinner={
        "spinner_css": {
            "width": "20px",
            "height": "20px",
            "border": "4px solid #333",         # Full border
            "border-top": "4px solid #0ff",     # Spinner highlight
            "border-radius": "50%",
            "animation": "spin 1s linear infinite"
        },
        "text_css": {
            "font-size": "15px",
            "font-weight": "bold"
        }
    },
    animation={  # Keyframes!
        "spin 1s linear infinite":
        "0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); }"
    }
)
spinner.start()
for i in range(21):
    spinner.set_text(f"<b>Loading...</b> {i*5}%")
    time.sleep(0.5)
spinner.stop()

Advanced Usage

Nested Progress Bars

from progressive_py.progress_bar import nested_bar, ProgressBar
import time

def task1(bar):
    for i in range(100):
        time.sleep(0.01)
        bar.update(i/99, i+1, 100)

def task2(bar):
    for i in range(50):
        time.sleep(0.01)
        bar.update(i/49, i+1, 50)

main = ProgressBar({'line':2})
childs = {
    "Task1": [task1, {"txt_lf": "Task1 {percent:.0f}%"}],
    "Task2": [task2, {"txt_lf": "Task2 {percent:.0f}%"}]
}
nested_bar(main, childs)

Threaded Bars

from progressive_py.progress_bar import ProgressBar
from progressive_py.utils import BarThreadManager
import time

def example_task(bar, pause_event, stop_check, cool_down=0.05):
    total = 100
    for i in range(total):
        if stop_check():
            break
        pause_event.wait()
        time.sleep(cool_down)
        bar.update(i / (total - 1), i + 1, total)

bar1 = ProgressBar({'txt_lf': 'Task 1 {percent:.0f}% {eta} {elapsed}', 'line': 1})
bar2 = ProgressBar({'txt_lf': 'Task 2 {percent:.0f}% {eta} {elapsed}', 'line': 0})

tasks = {
    "task1": [bar1, example_task],
    "task2": [bar2, example_task],
}

manager = BarThreadManager(tasks)
manager.start_all(cool_down=0.02)
manager.wait_all()
print("\nAll tasks completed.")

See docs/* documentation for more info


Customization

  • Text templates: Use {percent}, {iters}, {eta}, {elapsed}, {speed} in labels.
  • Colors: Pass color names or hex codes ('#ffaa00') for bars, spinners, and text.
  • CSS/HTML: In notebooks, customize with inline CSS and SVG for advanced visuals.
  • Thread control: Pause, resume, stop, and restart bars/spinners with BarThreadManager.

Why to choose it?

  • Interactive in notebooks and terminals – unlike tqdm, which is static in notebooks.
  • Easy customization – supports CSS styling in notebooks and multi-color bars in the terminal.
  • Lightweight and simple – less steep learning curve than rich but still very powerful.
  • Add-on, not a replacement – it works seamlessly alongside existing Python code.
  • Nested progress bars – handle parent/child tasks easily, which most other libraries can’t do out of the box.

Modules Overview

  • progress_bar.py: Terminal progress bars (single, nested, parallel).
  • spinner.py: Terminal spinners with color and threading.
  • ntbk_progbar.py: Notebook progress bars with HTML/CSS styling.
  • ntbk_spinner.py: Notebook spinners with advanced animation.
  • utils.py: Color handling, terminal control, thread management, error classes.
  • manager.py: Assets manager for progressive_py

Developed by Muhammad Abubakar Siddique Ansari

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

progressive_py-0.1.0.tar.gz (28.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

progressive_py-0.1.0-py3-none-any.whl (29.7 kB view details)

Uploaded Python 3

File details

Details for the file progressive_py-0.1.0.tar.gz.

File metadata

  • Download URL: progressive_py-0.1.0.tar.gz
  • Upload date:
  • Size: 28.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for progressive_py-0.1.0.tar.gz
Algorithm Hash digest
SHA256 afab5aeedcea3e878041e58c98cd5e3cf7b50a502819db2cc0e1d008624048fe
MD5 a85da47ac4fd1844cc5f4551d5f98e85
BLAKE2b-256 0aba0b609e345e517751ba2190e8c1b19b643345126e4e29b35f7278704c8c37

See more details on using hashes here.

File details

Details for the file progressive_py-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: progressive_py-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 29.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for progressive_py-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a3e57d5dc5b1c4ddb066ca5a966b4333ff90bdf9c3422b6c863589add5d975c0
MD5 14070857a19f4cf2cd32700501f2663d
BLAKE2b-256 b1a5c0c5b936ee9de55d9e60fa6c0b4836f4a3625347f40633eaf0151d50e5a6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page