Skip to main content

loadfx 2.2

Zero-dependency Python terminal effects and UI toolkit.

LOADFX provides loading animations, progress bars, text effects, menus, widgets, themes, logging and terminal UI primitives without runtime dependencies.

Install

python -m pip install loadfx

Highlights

  • 24+ built-in loading effects and custom frames
  • 14 built-in progress-bar styles
  • Single-line in-place progress by default
  • Iterator, context-manager and decorator progress APIs
  • Multi-progress and indeterminate progress
  • File/download-style byte progress
  • Foreground and background colors, including 256-color values
  • Progress percentage, speed and ETA reporting
  • Custom progress-bar fill and empty characters
  • Text colors, formatting, RGB, rainbow and gradient effects
  • Typing, banners and boxes
  • List, dictionary and nested menus
  • Multi-select menus
  • Tables, panels, trees and dashboard primitives
  • Terminal forms, file browser, command palette and app shell
  • Notifications and structured logging
  • Built-in themes and task runner
  • Keyboard callback registry and plugin base class
  • loadfx CLI
  • Python 3.8+
  • Zero runtime dependencies

Quick start

from loadfx import Loader, TextFX, Menu
import time

print(TextFX.rainbow("LOADFX"))
with Loader("Starting", effect="wave"):
    time.sleep(1)
choice = Menu({"Start": "start", "Settings": "settings", "Exit": "exit"}).show()
print(choice)

Progress bars

Progress bars redraw one terminal line by default. They do not print a new line for every update.

Basic

from loadfx import ProgressBar
import time

bar = ProgressBar(100, label="Downloading", show_eta=True, show_speed=True)
for i in range(101):
    bar.update(i)
    time.sleep(0.02)

Different styles

for style in ["classic", "dots", "blocks", "stars", "braille", "squares"]:
    bar = ProgressBar(100, style=style, label=style.title())
    for i in range(101):
        bar.update(i)

Available styles:

classic, blocks, dots, dotline, small-dots, arrows, squares, circles, braille, pulse, bars, hash, equals, stars.

Step updates

bar = ProgressBar(100, label="Installing")
for _ in range(20):
    install_step()
    bar.update(step=5)

Context manager

with ProgressBar(100, label="Building") as bar:
    for i in range(101):
        build_step()
        bar.update(i)

Iterator helper

from loadfx import track

for filename in track(files, label="Scanning", style="dots"):
    scan(filename)

Indeterminate progress

Use this when the total is unknown:

from loadfx import ProgressBar

bar = ProgressBar.indeterminate("Connecting")
bar.start()
connect_to_server()
bar.stop("Connected")

Multiple bars

from loadfx import MultiProgress

with MultiProgress() as progress:
    download = progress.add("Download", 100, style="dots")
    extract = progress.add("Extract", 100, style="blocks")
    install = progress.add("Install", 100, style="stars")

    for i in range(101):
        download.update(i)
        extract.update(min(i, 100))
        install.update(min(i * 2, 100))
        progress.refresh()

Colors

bar = ProgressBar(
    100,
    style="dots",
    foreground="cyan",
    background="black",
)

256-color values are also supported:

bar = ProgressBar(100, foreground=51, background=235)

Custom characters

bar = ProgressBar(
    100,
    custom_fill="▓",
    custom_empty="░",
)

Custom output format

bar = ProgressBar(
    100,
    format_string="{label} [{bar}] {percent:.0f}% | {speed:.1f}/s | ETA {eta:.1f}s",
)

Supported fields include label, bar, percent, current, total, speed, eta and elapsed.

Stream mode

If you intentionally want every update on its own line:

bar = ProgressBar(10, mode="stream")
for i in range(11):
    bar.update(i)

The default is mode="single".

Loading effects

from loadfx import Loader
import time

with Loader("Processing", effect="matrix"):
    time.sleep(2)

Loader("Processing", frames=["[   ]", "[=  ]", "[== ]", "[===]"]).start()

Built-in loading effects include dots, spinner, line, arrows, bounce, pulse, circle, square, braille, clock, wave, bars, blocks, grow, shrink, orbit, arc, snake, ping, heart, star, matrix, scan, and moon.

Forms

from loadfx import Form

form = Form("Create Account")
form.input("username", required=True)
form.password("password", required=True)
form.input("email", required=True)
result = form.show()

App shell

from loadfx import App

App("My App").header("LOADFX").main("Hello terminal").footer("Ready").run()

Widgets and tools

from loadfx import Table, Panel, Tree, FileBrowser, CommandPalette

Table(["Name", "Status"], [["loadfx", "Active"]], style="rounded").show()

License

MIT License. See the repository for the complete source and release history.

Metadata

Release files for loadfx 2.3.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for loadfx 2.3.3
File Size Uploaded
loadfx-2.3.3.tar.gz 19.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for loadfx 2.3.3
File Interpreter ABI Platform
loadfx-2.3.3-py3-none-any.whl Python 3 none any Details

Total release size: 41.0 kB

Release files / loadfx-2.3.3.tar.gz

Download URL loadfx-2.3.3.tar.gz
Size 19.3 kB
Tags Source
SHA-256 checksum
How to use checksums
c3e950db0561986cc873c430d713e4684fde7c0857adaba639900b7a00f768d5
BLAKE2b-256 checksum
How to use checksums
e61c092ffc200aa17f80e5246f8c0bfe7f6fdf4f00e2874878791be6be32df9f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 17, 2026.

Transparency log

Release files / loadfx-2.3.3-py3-none-any.whl

Download URL loadfx-2.3.3-py3-none-any.whl
Size 21.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
99ad6c803ef013a49f41863fe8fac55cc0b71f923d266261576d36e9787a08c5
BLAKE2b-256 checksum
How to use checksums
e798d310ea6647a67086db830d511b4ab4d104a33542e9cf4e4870db48c84b10
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 17, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.3.3 This release

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page