Super Bario: a powerful Python library for multi-bar, multi-layout terminal progress indicators with themes, widgets, and thread-safe updates.
Project description
🎮 Super Bario — Multi-Bar, Multi-Layout Terminal Progress for Python
Super Bario is a powerful, layout-aware, multi-bar terminal progress library for Python.
It supports dynamic titles, nested layouts, multiple views per bar, themes, widgets, thread-safe rendering, and responsive terminal resizing.
Think of it as the Super Mario of progress bars: fast, modular, elegant, and fun.
✨ Key Features
🔹 Progress Wrapper
A simple, elegant wrapper over any iterable — with optional counters, themes, spinners, dynamic titles, and context-managed timing.
🔹 Dynamic Titles
Bar titles can be static strings or callables:
from super_bario import progress
...
for fname in progress(files, title=lambda p: f"Processing file #{p.index}: {p.value}"):
# ...
Super Bario updates them automatically for every loop iteration.
🔹 Layouts & Views
- Stack bars vertically, horizontally, or in nested layouts
- A View binds widgets and a theme to a bar
- A Bar can have multiple Views
- A Layout can appear in multiple parent layouts
🔹 Widgets
Every component (bar, percent, counter, time, spinner, rate) is a widget.
You can subclass and create your own:
class MyWidget(Widget):
def render(self, bar):
return f"[{bar.current}/{bar.total}]"
🔹 Demo
This animation was produced by running the code in
examples/examples.py
🔹 Themes
Themes define:
- character sets
- colors
- gradients
- bar fill behaviors
- spinner styles
Built-ins include: default, minimal, matrix, fire, load, etc.
🔹 Thread‑Safe Output
Super Bario handles:
- multiple threads writing to bars
- additional
print()calls - synchronization between stdout & stderr
No flicker, no tearing, no overlapping output.
🔹 Terminal Resize Handling
Resize your terminal — Super Bario recalculates widths and reflows layouts correctly.
🔹 Completion Behavior
Bars may optionally be removed once completed, which is useful for log-style or long-running background tasks.
🚀 Installation
pip install super-bario
If you prefer, you can also use the library directly by importing progress.py.
🏁 Quick Examples
Below are three core usage modes.
1️⃣ Progress Wrapper
Minimal usage
from super_bario import progress
import time
for item in progress(range(100), title="Processing"):
time.sleep(0.01)
With dynamic title
for item in progress(
range(5),
title=lambda item: f"Loading item {item.index}: {item.value}",
theme=Theme.fire()
):
time.sleep(0.1)
2️⃣ Queue / Collection Watching
Super Bario can watch and update a bar based on the size or consumption of a queue-like object.
Below is a minimal setup example for registering watched collections:
from super_bario import Progress
from queue import Queue
queue = Queue()
q = Queue(maxsize=1000)
l = []
Progress.create_row("row_1")
Progress.create_column("col_1", parents=["row_1"])
Progress.create_column("col_2", parents=["row_1"])
Progress.add_watch(q, "Queue", layouts=["col_1"])
Progress.add_watch(l, "List", max=1000, layouts=["col_2"])
3️⃣ Manual Bar + Layouts + Views
Explicit bar creation
from super_bario import Bar, Progress, View, Theme
bar = Bar(total=100, title="Download assets")
view = View(bar, theme=Theme.matrix())
# Bind bar to controller
Progress.add_bar(bar, view)
for i in range(100):
bar.increment()
Progress.display()
Nested layouts
from super_bario import Bar, View, Theme, Progress
bar1 = Bar(total=100, title="Core tasks")
bar2 = Bar(total=50, title="Subtasks")
view1 = View(bar1, theme=Theme.fire())
view2 = View(bar2, theme=Theme.minimal())
Progress.create_row("row_1")
Progress.create_column("col_1", parents=["row_1"])
Progress.create_column("col_2", parents=["row_1"])
Progress.create_row("row_2")
Progress.add_bar(bar1, view=view1, layouts=["col_1"])
Progress.add_bar(bar2, view=view2, layouts=["col_2"])
Progress.add_layout("col_1", parents=["row_2"])
Progress.add_layout("col_2", parents=["row_2"])
Progress.display()
🧱 Building Custom Views
from super_bario import View, TitleWidget, BarWidget, PercentageWidget, Theme
custom_view = View(
widgets=[
TitleWidget(),
BarWidget(),
PercentageWidget(),
],
theme=Theme.default(),
)
Views and widgets are entirely composable.
🔧 Creating Custom Widgets
from super_bario import Widget
class SpeedWidget(Widget):
def render(self, bar):
if bar.current == 0:
return "(start)"
return f"{bar.current / bar.elapsed_time():.2f}/s"
Bind it in a view:
from super_bario import View, Bar, Theme
bar = Bar(total=300)
view = View(bar, widgets=[SpeedWidget()], theme=Theme.minimal())
Progress.add_bar(bar, view)
🔧 Creating Custom Bars in One Call
bars = []
bar = Progress.add_custom_bar(
total=100,
title="Custom icons",
indent=0,
remove_on_complete=False,
char_start_incomplete='🏹',
char_start_complete='🏅',
char_end_incomplete='',
char_end_complete='🎯',
char_incomplete=' ',
char_complete=' ',
char_complete_fractions=['➳'],
)
bars.append(bar)
bar = Progress.add_custom_bar(
total=1000,
title="Custom fractions",
indent=0,
remove_on_complete=False,
char_start_incomplete='',
char_end_incomplete='',
char_incomplete=' ',
char_complete='⣿',
char_complete_fractions=['⣀', '⣄', '⣆', '⣇', '⣧', '⣷', '⣿'],
)
bars.append(bar)
with Progress: # another way to manage Progress lifecycle
for bar in bars:
for i in progress(range(1, 100 + 1), bar=bar):
time.sleep(0.02)
🔧 Customize behavior
Super Bario exposes several global configuration options on the Progress class that control how progress bars are rendered, updated, and cleaned up.
Display & lifecycle
-
Progress.remove_on_complete: bool
Remove progress bars from the display once all of them are complete.
Default: False -
Progress.force_redraw: bool
Clear the entire output before each redraw. This may cause visible flickering, but helps avoid rendering artifacts when using Unicode characters that occupy more than one terminal cell.
Default: False -
Progress.stream: TextIO
Output stream used for rendering progress bars.
Default: sys.stderr
Terminal layout & resizing
- Progress.terminal_padding_right: int
Number of characters reserved on the right side of the terminal.
This margin helps handle terminal resizing more safely. Setting it to 0 uses the full width, but resize handling may be less reliable.
Default: 20
Update frequency & performance
-
Progress.watch_interval: float
How often watched queues are polled, in seconds.
Default: 0.5 -
Progress.min_update_interval: float
Minimum time (in seconds) between visual updates.
Default: 0.1 -
Progress.min_update_progress: float
Minimum progress delta required to trigger a redraw.
Default: 0.01 (1%) -
Progress.update_on_item_change: bool
Force a redraw on every item update, even if neither the time nor progress thresholds are met.
Default: True
🧵 Thread Safety
Super Bario uses a synchronized renderer:
- ensures terminal updates are atomic
- serializes writes from worker threads
- respects interleaved logging
- uses stderr for drawing and stdout for normal prints
- avoids line tearing or partial frames
🖥 Terminal Resize Handling
When your terminal is resized:
- dimensions are recalculated
- layouts redraw correctly
- bars truncate or expand intelligently
- widgets align cleanly
No smearing, no clipping artifacts.
🏁 When Bars Complete
Bars can:
- stay in place
- show a final “completed” frame
- or be removed entirely (optional)
Useful for background logging-style progress displays.
📦 Project Status
Super Bario is in active development, but already stable in production environments.
Contributions, PRs, and ideas are very welcome.
📄 License
MIT License
Copyright © 2025 Igor Iatsenko
💬 Support / Issues
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file super_bario-0.3.9.tar.gz.
File metadata
- Download URL: super_bario-0.3.9.tar.gz
- Upload date:
- Size: 27.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
afb8e5c8374b58f7b59cd0168656f73a289318969198953c64ebf4cabd05ab3c
|
|
| MD5 |
cb76da8d28be9afc88d3049930f324aa
|
|
| BLAKE2b-256 |
d9dae519df9af3de4e64c9f44c377862060920537531ef0f1102f4e16cc39513
|
File details
Details for the file super_bario-0.3.9-py3-none-any.whl.
File metadata
- Download URL: super_bario-0.3.9-py3-none-any.whl
- Upload date:
- Size: 23.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc543ee9232c37a160a06b4a87625083ce95bfdd56e51322308a80ee48600f46
|
|
| MD5 |
ca6c03a32d46bcbc1d5819a0a522dd08
|
|
| BLAKE2b-256 |
bb949dab829ff61cbfda4d5811377ac15fbe2209c2c9cb7a3669c478c21e9edc
|