Dead simple GNOME panel status updates - inspired by ggplot2
Project description
PanelStatus 📊
Dead simple GNOME panel status updates - Inspired by ggplot2's ease of use
Display static text, scrolling messages, and more in your GNOME top panel with just one line of Python!
Installation
from panelstatus import install_extension, restart_shell
# Install the GNOME extension
install_extension()
# Restart GNOME Shell automatically
restart_shell()
Or use the command line:
pip install panelstatus
python3 -c "from panelstatus import install_extension, restart_shell; install_extension(); restart_shell()"
Features
✨ Static text - Show status messages 🎬 Smooth scrolling - Perfect for long messages 🎨 Colors - Named colors or custom hex codes ⚡ Fast - Minimal overhead, smooth 60fps animations 🐍 Pythonic - Simple, intuitive API 📦 Self-installing - Extension installs with one function call! 🔀 Multi-process - Multiple apps can display simultaneously with automatic space allocation
Quick Start
from panelstatus import status
# Static text
status.set("Processing...", color="blue")
# Scrolling text
status.scroll("This is a long message that scrolls smoothly!")
# Clear
status.clear()
Usage
Basic Static Status
from panelstatus import status
status.set("Processing...")
status.set("Done!", color="green")
status.clear()
Scrolling Text
# For long messages
status.scroll("This is a long message that scrolls smoothly across your panel! ")
# With color
status.scroll("Welcome to my app!", color="blue")
# Control speed (1.0 = default, 2.0 = 2x faster, 0.5 = slower)
status.scroll("Slow scroll...", speed=0.5)
status.scroll("Fast scroll!", speed=2.0)
# Adjust display width
status.scroll("Custom width", width=200)
Switch Between Modes
import time
status.set("Starting task...", color="yellow")
time.sleep(2)
status.scroll("Processing lots of data... this might take a while...")
time.sleep(5)
status.set("Complete!", color="green")
Colors
Named colors:
red,green,blueyellow,orange,purplegray,white
Custom hex codes:
status.set("Custom", color="#ff00ff")
Log Feed (Streaming Logs)
# Perfect for continuous log updates!
status.feed("Server started")
status.feed("Connected to database")
status.feed("Ready on port 8080")
# Shows: "Server started | Connected to database | Ready on port 8080" (scrolling)
# Customize separator and buffer size
status.feed("Log line", max_lines=10, separator=" • ")
Progressive Append (Smart Scrolling)
# Accumulates text, stays static until too long, then scrolls to end
status.append("Starting...")
status.append("Step 1 complete")
status.append("Step 2 complete")
status.append("All done!")
# Three scrolling modes:
# 1. INSTANT - Jump immediately to new content (best for alerts)
status.append("Error occurred!", scroll_mode="instant", color="red")
# 2. SMOOTH - Zen-like constant scrolling (default, best for ambience)
status.append("Processing...", scroll_mode="smooth", scroll_speed=0.5)
# 3. ADAPTIVE - Speed up when behind, slow down when caught up
# (best for progress tracking)
status.append("Task complete", scroll_mode="adaptive",
scroll_min=0.5, scroll_max=4.0, color="green")
Choosing the right scroll mode:
| Mode | Behavior | Best For | Example Use Case |
|---|---|---|---|
instant |
Jumps immediately to new content | Real-time alerts, monitoring | Error notifications, system alerts |
smooth |
Constant zen-like scrolling | Ambient displays, background processes | Build progress, server status |
adaptive |
Speeds up when behind, slows when caught up | Progress tracking, log streaming | Test results, batch processing |
Context Manager (Auto-clear)
with status.show("Working...", color="blue"):
# Your code here
do_something()
# Status automatically cleared!
Multi-Process Support
Multiple applications can display status simultaneously with automatic space allocation:
# Process 1: Build system
build_status = Status(id="build")
build_status.set_weight(2.0) # Gets 2x space
build_status.append("Compiling...", color="blue")
# Process 2: Test runner
test_status = Status(id="tests")
test_status.set_weight(1.0) # Default weight
test_status.append("Running tests...", color="green")
# They appear side-by-side: [Compiling...] [Running tests...]
Space Allocation:
- Extension uses max 40% of panel width by default
- Space divided among processes based on weights
- Automatic cleanup after 30s of inactivity
- Dynamic reallocation when processes start/stop
API Reference
Status(id=None)
Create a status controller instance.
Args:
id(str, optional): Unique process identifier for multi-process support. If None (default), uses singleton mode.
Example:
# Single process (default)
from panelstatus import status
status.set("Working...")
# Multi-process
build = Status(id="build")
tests = Status(id="tests")
set_weight(weight)
Set space allocation weight for multi-process display.
Args:
weight(float): Space allocation multiplier (default 1.0). Higher = more space.
Example:
build_status = Status(id="build")
build_status.set_weight(2.0) # Gets 2x space
install_extension()
Install the GNOME Shell extension (one-time setup).
from panelstatus import install_extension
install_extension()
restart_shell()
Restart GNOME Shell to reload extensions (X11 only).
from panelstatus import restart_shell
restart_shell()
status.set(text, color=None)
Display static text in the panel.
Args:
text(str): Message to displaycolor(str, optional): Color name or hex code
status.scroll(text, color=None, speed=1.0, width=150)
Display scrolling text (perfect for long messages).
Args:
text(str): Message to scrollcolor(str, optional): Color name or hex codespeed(float, optional): Scroll speed multiplier (default 1.0)width(int, optional): Display width in pixels (default 150)
status.feed(text, color=None, max_lines=5, separator=" | ", speed=1.0, width=200)
Add text to a rolling log feed.
Args:
text(str): Log line to addcolor(str, optional): Color name or hex codemax_lines(int, optional): Buffer size (default 5)separator(str, optional): Text between lines (default " | ")speed(float, optional): Scroll speed multiplierwidth(int, optional): Display width in pixels
status.append(text, color=None, separator=" ", width=300, scroll_mode="smooth", scroll_speed=1.0, scroll_min=0.3, scroll_max=3.0)
Append text progressively with configurable scrolling behavior.
Text stays static until it exceeds the panel width, then scrolls to the end and stops. Adding more text resumes scrolling.
Args:
text(str): Text to appendcolor(str, optional): Color name or hex codeseparator(str, optional): Text between appends (default " ")width(int, optional): Display width in pixels (default 300)scroll_mode(str, optional): Scrolling behavior - "instant", "smooth", or "adaptive" (default "smooth")scroll_speed(float, optional): Speed multiplier for smooth mode (default 1.0)scroll_min(float, optional): Minimum speed for adaptive mode (default 0.3)scroll_max(float, optional): Maximum speed for adaptive mode (default 3.0)
Scroll Modes:
"instant": Jump immediately to show new content (best for real-time alerts)"smooth": Constant zen-like scrolling (best for ambient displays)"adaptive": Variable speed - accelerates when far behind, slows when caught up (best for progress tracking)
status.clear()
Remove status from panel.
status.show(text, color=None)
Context manager that auto-clears when done.
Real-World Examples
Long-running task:
from panelstatus import status
import requests
status.scroll("Downloading data from API... ")
data = requests.get("https://api.example.com/data").json()
status.set("Processing...", color="yellow")
results = process(data)
status.set("Complete! ✓", color="green")
Build script:
status.set("Building...", color="blue")
os.system("npm run build")
status.set("Build complete!", color="green")
Training progress:
for epoch in range(100):
status.scroll(f"Training epoch {epoch}/100... ", color="orange")
train_model(epoch)
status.set("Training complete!", color="green")
Philosophy
Like ggplot2 made plotting simple, PanelStatus makes status updates trivial:
- ✅ Simple API - Just
status.set()orstatus.scroll()and go - ✅ Sensible defaults - Works beautifully out of the box
- ✅ Minimal boilerplate - No complex setup or configuration
- ✅ Pythonic - Feels natural and intuitive
- ✅ Versatile - Static text, scrolling, colors, auto-clear
- ✅ Self-contained - Extension bundles with the library
Try the Demo
Run the example to see all features:
python3 ~/panelstatus-lib/example.py
Watch your panel for static messages, smooth scrolling, and color changes!
Enjoy simple status updates! 🎉
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 panelstatus-1.1.0.tar.gz.
File metadata
- Download URL: panelstatus-1.1.0.tar.gz
- Upload date:
- Size: 16.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
397810c4d06a0a31e75804aa62ef291df27d373e277a20a3889bec5c012e975a
|
|
| MD5 |
19f907516dbda31f3015bb4314b39816
|
|
| BLAKE2b-256 |
921784a1e8950b71c1575cb843c2c3781e2b81b9f441d46bb86a0d5d730494df
|
File details
Details for the file panelstatus-1.1.0-py3-none-any.whl.
File metadata
- Download URL: panelstatus-1.1.0-py3-none-any.whl
- Upload date:
- Size: 13.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
895530a0fcf654d0107ae78f247c9ef9a81bdbeedb0b88e6e6f402d0978ed579
|
|
| MD5 |
f05b0f1d234db7f81b252f908ee232b7
|
|
| BLAKE2b-256 |
e96a4d9f774b14874a94371eb5c7a9812ed427c2f6b4a687a1c845083bc1e0be
|