A robust curses wrapper for creating Text User Interfaces (TUIs).
Project description
console-window
A robust and feature-rich wrapper for the standard Python curses library, simplifying the creation of complex, full-screen Text User Interface (TUI) applications.
This package abstracts away the complexities of managing curses pads, dynamic screen resizing, custom scroll/pick synchronization, and keyboard handling, allowing developers to focus purely on content.
Installation
Install the package via pip:
pip install console-window
Core Features (The "Secret Sauce")
The wrapper handles several advanced terminal interaction patterns automatically:
- Padded Content Management: Uses separate
headandbodypads, allowing for a static header area while the main content area can be scrolled independently. - Seamless Resizing: Automatically detects terminal size changes (
KEY_RESIZE) and recalculates layout dimensions, with robust error handling to prevent commoncurses.errorcrashes during resizing. - Scroll & Pick Synchronization: The
Windowclass manages scroll position and a separate pick position (highlighted row) simultaneously.- When using pick mode, scrolling automatically tracks the highlighted element to keep it visible in
.pick_pos. - To use that value, you must separately be able to associate
.pick_posto its value by, say, keeping an array of values for every added line to thebody.
- When using pick mode, scrolling automatically tracks the highlighted element to keep it visible in
- Intuitive Navigation: Provides built-in handling for common navigation keys (
j/k,UP/DOWN, Page Up/Down,H/M/Lfor home/middle/last viewable line, etc.). - Dynamic Options Management (
OptionSpinner): The companion class simplifies creation of application settings, allowing users to toggle options or input strings using single keypresses (e.g.,pto toggle pick mode). - Blocking Popups: Includes fully implemented, blocking pop-up methods for user input (
.answer()) and alerts (.alert()), handling the necessary temporary screen takeover and cursor management.
Minimal Working Example
This example demonstrates setting up the window, using the OptionSpinner for control, and running the main render/prompt loop.
import curses
from console_window import ConsoleWindow, ConsoleWindowOpts, OptionSpinner
def main_app_loop(stdscr):
# 1. Setup Options Manager
spin = OptionSpinner()
opts = spin.default_obj # Access options via this namespace
# Add features controlled by keypresses
spin.add_key('help_mode', '? - toggle help screen', vals=[False, True])
spin.add_key('pick_mode', 'p - toggle pick mode', vals=[False, True])
spin.add_key('pick_size', 's - #rows in pick', vals=[1, 2, 3])
spin.add_key('name', 'n - select name', prompt='Provide Your Name:')
spin.add_key('quit', 'q,Q - quit the app', category='action', keys={ord('Q'), ord('q')})
# 2. Initialize Window with ConsoleWindowOpts
win_opts = ConsoleWindowOpts(
head_line=True,
keys=spin.keys,
min_cols_rows=(60, 20),
single_cell_scroll_indicator=True
)
win = ConsoleWindow(opts=win_opts)
opts.name = "[hit 'n' to enter name]"
loop_count = 0
while True:
loop_count += 1
# 3. Add Content
if opts.help_mode:
win.set_pick_mode(False)
spin.show_help_nav_keys(win)
spin.show_help_body(win)
else:
win.set_pick_mode(opts.pick_mode, opts.pick_size)
win.add_header(f'TUI App Header | Loop: {loop_count} | Name: "{opts.name}"')
# Add body content (scrollable)
for idx in range(100):
win.add_body(f'Main Item {idx+1}')
# 4. Render and Prompt for Input
win.render()
key = win.prompt(seconds=0.5) # Wait for half a second or a keypress
# 5. Handle Keys (App-specific logic)
if key is not None:
# Check if OptionSpinner can handle the key (p, s, n, ?)
spin.do_key(key, win)
if opts.quit:
opts.quit = False
break # Exit the loop
win.clear()
if __name__ == '__main__':
try:
# Note: Window.__init__ starts curses and registers atexit cleanup
curses.wrapper(main_app_loop)
except KeyboardInterrupt:
pass
License
MIT
Projects Using console-window
For more extensive examples, you can look at some projects using console-window:
- efibootdude
- simple wrapper for
efibootmgr - one of the smaller projects
- demonstrates a context sensitive available keys lines (i.e., first line) where the actions depend on current line.
- simple wrapper for
- dwipe
- disk cleaner with parallel jobs and stamps wiped partitions
- pmemstat
- system/process memory monitor with rollups and hooks for zRAM
- memfo
- viewer of /proc/meminfo that shows historical values
- vappman
- convenince wrapper to mostly hide CLI of AppMan, a life-cycle manager for 2000+ AppImages
- my-snaps
- special purpose BTRFS snap manager
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 console_window-1.3.1.tar.gz.
File metadata
- Download URL: console_window-1.3.1.tar.gz
- Upload date:
- Size: 44.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.31.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1e4c8c49891aa1a738d6c7bd169bab362d6aeb60835123e8a58ccc668cb1de6
|
|
| MD5 |
e61d03cb7b38efa82a490202d234eb2a
|
|
| BLAKE2b-256 |
487f8c838e364671711db4b74464d23a26c066d18d8543541570c7c2721bc9e3
|
File details
Details for the file console_window-1.3.1-py3-none-any.whl.
File metadata
- Download URL: console_window-1.3.1-py3-none-any.whl
- Upload date:
- Size: 41.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.31.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da6b196dc4fb0636ce1256299699832f37b6fc50f34cf724eaba926c99d9c751
|
|
| MD5 |
724668f4e89dba8a89bbc4b57388af75
|
|
| BLAKE2b-256 |
dea81e4c8c1699684c83232bddc5b7e9b18160b844e1b3839891993631077dcc
|