A widget and grid based framework for building command line user interfaces in python.
—
Color system with predefined color pairs, custom color rules for syntax highlighting, border customization, and visual theming options.
Built-in color combinations for common UI elements and themes.
# Black background colors
WHITE_ON_BLACK: int # Default color scheme (1)
YELLOW_ON_BLACK: int # Warning text (2)
RED_ON_BLACK: int # Error text on dark (3)
CYAN_ON_BLACK: int # Highlight text (4)
MAGENTA_ON_BLACK: int # Special text (5)
GREEN_ON_BLACK: int # Success text (6)
BLUE_ON_BLACK: int # Info text (7)
# Green background colors
BLACK_ON_GREEN: int # Terminal green theme (8)
WHITE_ON_GREEN: int # (9)
YELLOW_ON_GREEN: int # (10)
RED_ON_GREEN: int # (11)
CYAN_ON_GREEN: int # (12)
MAGENTA_ON_GREEN: int # (13)
BLUE_ON_GREEN: int # (14)
# White background colors
BLACK_ON_WHITE: int # Inverted scheme (15)
YELLOW_ON_WHITE: int # (16)
RED_ON_WHITE: int # (17)
CYAN_ON_WHITE: int # (18)
GREEN_ON_WHITE: int # (19)
MAGENTA_ON_WHITE: int # (20)
BLUE_ON_WHITE: int # (21)
# Red background colors
WHITE_ON_RED: int # Error/alert theme (22)
BLACK_ON_RED: int # (23)
YELLOW_ON_RED: int # (24)
CYAN_ON_RED: int # (25)
GREEN_ON_RED: int # (26)
BLUE_ON_RED: int # (27)
MAGENTA_ON_RED: int # (28)
# Cyan background colors
WHITE_ON_CYAN: int # (29)
BLACK_ON_CYAN: int # (30)
RED_ON_CYAN: int # (31)
YELLOW_ON_CYAN: int # (32)
MAGENTA_ON_CYAN: int # (33)
GREEN_ON_CYAN: int # (34)
BLUE_ON_CYAN: int # (35)
# Yellow background colors
BLACK_ON_YELLOW: int # (36)
WHITE_ON_YELLOW: int # (37)
RED_ON_YELLOW: int # (38)
GREEN_ON_YELLOW: int # (39)
BLUE_ON_YELLOW: int # (40)
CYAN_ON_YELLOW: int # (41)
MAGENTA_ON_YELLOW: int # (42)
# Magenta background colors
BLACK_ON_MAGENTA: int # (43)
WHITE_ON_MAGENTA: int # (44)
RED_ON_MAGENTA: int # (45)
GREEN_ON_MAGENTA: int # (46)
BLUE_ON_MAGENTA: int # (47)
YELLOW_ON_MAGENTA: int # (48)
CYAN_ON_MAGENTA: int # (49)
# Blue background colors
BLACK_ON_BLUE: int # (50)
WHITE_ON_BLUE: int # (51)
RED_ON_BLUE: int # (52)
GREEN_ON_BLUE: int # (53)
YELLOW_ON_BLUE: int # (54)
CYAN_ON_BLUE: int # (55)
MAGENTA_ON_BLUE: int # (56)Usage example:
import py_cui
root = py_cui.PyCUI(3, 3)
# Create widgets with different color schemes
title = root.add_block_label('Success!', 0, 0, column_span=3)
title.set_standard_color(py_cui.GREEN_ON_BLACK)
warning_text = root.add_text_block('Warnings', 1, 0)
warning_text.set_standard_color(py_cui.YELLOW_ON_BLACK)
error_button = root.add_button('Error', 1, 1)
error_button.set_standard_color(py_cui.WHITE_ON_RED)
# Show different colored popups
def show_success():
root.show_message_popup('Success', 'Operation completed!', py_cui.GREEN_ON_BLACK)
def show_warning():
root.show_message_popup('Warning', 'Check your input.', py_cui.YELLOW_ON_BLACK)
def show_error():
root.show_message_popup('Error', 'Something went wrong!', py_cui.RED_ON_BLACK)
success_btn = root.add_button('Success', 2, 0, command=show_success)
warning_btn = root.add_button('Warning', 2, 1, command=show_warning)
error_btn = root.add_button('Error', 2, 2, command=show_error)Methods for setting colors on individual widgets including standard colors and border colors.
# Widget color methods
def set_standard_color(color: int) -> None:
"""
Set the default color for this widget.
Parameters:
- color: Color pair constant
"""
def set_border_color(color: int) -> None:
"""
Set the border color for this widget.
Parameters:
- color: Color pair constant for widget borders
"""Usage example:
root = py_cui.PyCUI(3, 3)
# Create widgets with custom colors
menu = root.add_scroll_menu('Files', 0, 0)
menu.set_standard_color(py_cui.WHITE_ON_BLUE)
menu.set_border_color(py_cui.YELLOW_ON_BLACK)
text_output = root.add_text_block('Output', 0, 1, column_span=2)
text_output.set_standard_color(py_cui.GREEN_ON_BLACK)
text_output.set_border_color(py_cui.WHITE_ON_GREEN)
# Input box with error styling
error_input = root.add_text_box('Error Input', 1, 0)
error_input.set_standard_color(py_cui.WHITE_ON_RED)
error_input.set_border_color(py_cui.RED_ON_BLACK)System for applying color rules to text content based on patterns, enabling syntax highlighting and conditional formatting.
def set_color_rule(regex: str, color: int, rule_type: str,
match_type: str = "line") -> None:
"""
Add a color rule for pattern-based text coloring.
Parameters:
- regex: Regular expression pattern to match
- color: Color pair to apply to matches
- rule_type: Type of color rule ("startswith", "endswith", "contains", "regex")
- match_type: What to color - "line" or "match" (default: "line")
"""
def clear_color_rules() -> None:
"""Remove all color rules from this widget."""Usage example:
import py_cui
root = py_cui.PyCUI(3, 3)
log_viewer = root.add_text_block('System Log', 0, 0, column_span=3, row_span=2)
# Set up color rules for log levels
log_viewer.set_color_rule('ERROR', py_cui.RED_ON_BLACK, 'contains', 'line')
log_viewer.set_color_rule('WARNING', py_cui.YELLOW_ON_BLACK, 'contains', 'line')
log_viewer.set_color_rule('INFO', py_cui.BLUE_ON_BLACK, 'contains', 'line')
log_viewer.set_color_rule('SUCCESS', py_cui.GREEN_ON_BLACK, 'contains', 'line')
# Add sample log content
log_content = """
2023-01-01 10:00:00 INFO Application started
2023-01-01 10:01:00 INFO Loading configuration
2023-01-01 10:02:00 WARNING Configuration file outdated
2023-01-01 10:03:00 ERROR Failed to connect to database
2023-01-01 10:04:00 SUCCESS Database connection restored
"""
log_viewer.set_text(log_content)
# Code syntax highlighting example
code_viewer = root.add_text_block('Code', 2, 0, column_span=3)
# Python syntax highlighting rules
code_viewer.set_color_rule(r'def \w+', py_cui.BLUE_ON_BLACK, 'regex', 'match')
code_viewer.set_color_rule(r'class \w+', py_cui.MAGENTA_ON_BLACK, 'regex', 'match')
code_viewer.set_color_rule(r'#.*', py_cui.GREEN_ON_BLACK, 'regex', 'match') # Comments
code_viewer.set_color_rule(r'".*?"', py_cui.YELLOW_ON_BLACK, 'regex', 'match') # Strings
code_content = '''
def hello_world():
"""A simple greeting function."""
# Print greeting message
print("Hello, World!")
class MyClass:
pass
'''
code_viewer.set_text(code_content)System for customizing widget border appearance with different character sets.
def toggle_unicode_borders() -> None:
"""Toggle between Unicode and ASCII border characters for all widgets."""
def set_widget_border_characters(upper_left_corner: str, upper_right_corner: str,
lower_left_corner: str, lower_right_corner: str,
horizontal: str, vertical: str) -> None:
"""
Set custom border characters for all widgets.
Parameters:
- upper_left_corner: Character for upper left corner
- upper_right_corner: Character for upper right corner
- lower_left_corner: Character for lower left corner
- lower_right_corner: Character for lower right corner
- horizontal: Character for horizontal borders
- vertical: Character for vertical borders
"""Usage example:
root = py_cui.PyCUI(3, 3)
# Start with ASCII borders (default)
menu1 = root.add_scroll_menu('ASCII Borders', 0, 0)
# Switch to Unicode borders
root.toggle_unicode_borders()
menu2 = root.add_scroll_menu('Unicode Borders', 0, 1)
# Custom border style - double lines
root.set_widget_border_characters('╔', '╗', '╚', '╝', '═', '║')
menu3 = root.add_scroll_menu('Double Border', 0, 2)
# Custom border style - rounded corners
root.set_widget_border_characters('╭', '╮', '╰', '╯', '─', '│')
info_box = root.add_text_block('Rounded Border', 1, 0, column_span=3)
# Custom border style - thick borders
root.set_widget_border_characters('┏', '┓', '┗', '┛', '━', '┃')
button = root.add_button('Thick Border Button', 2, 1)Examples of complex color schemes and theming patterns.
# Advanced color usage patterns (examples)Usage example:
import py_cui
class ThemedApplication:
def __init__(self):
self.root = py_cui.PyCUI(4, 4)
self.current_theme = 'dark'
self.setup_widgets()
self.apply_theme(self.current_theme)
def setup_widgets(self):
# Header
self.header = self.root.add_block_label('Themed App', 0, 0, column_span=4)
# Navigation menu
self.nav_menu = self.root.add_scroll_menu('Navigation', 1, 0, row_span=2)
self.nav_menu.add_item_list(['Home', 'Settings', 'About', 'Exit'])
# Main content area
self.content = self.root.add_text_block('Content', 1, 1,
row_span=2, column_span=2)
# Status/info panel
self.status = self.root.add_text_box('Status', 1, 3, row_span=2)
# Control buttons
self.theme_btn = self.root.add_button('Switch Theme', 3, 0,
command=self.toggle_theme)
self.exit_btn = self.root.add_button('Exit', 3, 3,
command=self.root.stop)
def apply_theme(self, theme_name):
if theme_name == 'dark':
self.apply_dark_theme()
elif theme_name == 'light':
self.apply_light_theme()
elif theme_name == 'terminal':
self.apply_terminal_theme()
def apply_dark_theme(self):
# Dark theme colors
header_color = py_cui.WHITE_ON_BLUE
content_color = py_cui.WHITE_ON_BLACK
accent_color = py_cui.CYAN_ON_BLACK
self.header.set_standard_color(header_color)
self.nav_menu.set_standard_color(content_color)
self.nav_menu.set_border_color(accent_color)
self.content.set_standard_color(content_color)
self.status.set_standard_color(py_cui.YELLOW_ON_BLACK)
# Set color rules for content
self.content.clear_color_rules()
self.content.set_color_rule('TODO', py_cui.YELLOW_ON_BLACK, 'contains')
self.content.set_color_rule('DONE', py_cui.GREEN_ON_BLACK, 'contains')
self.content.set_color_rule('ERROR', py_cui.RED_ON_BLACK, 'contains')
self.root.set_title('Themed App - Dark Mode')
def apply_light_theme(self):
# Light theme colors
header_color = py_cui.BLACK_ON_WHITE
content_color = py_cui.BLACK_ON_WHITE
accent_color = py_cui.BLACK_ON_CYAN
self.header.set_standard_color(header_color)
self.nav_menu.set_standard_color(content_color)
self.nav_menu.set_border_color(accent_color)
self.content.set_standard_color(content_color)
self.status.set_standard_color(py_cui.BLACK_ON_YELLOW)
self.root.set_title('Themed App - Light Mode')
def apply_terminal_theme(self):
# Retro terminal theme
header_color = py_cui.BLACK_ON_GREEN
content_color = py_cui.GREEN_ON_BLACK
accent_color = py_cui.WHITE_ON_GREEN
self.header.set_standard_color(header_color)
self.nav_menu.set_standard_color(content_color)
self.nav_menu.set_border_color(accent_color)
self.content.set_standard_color(content_color)
self.status.set_standard_color(content_color)
# Terminal-style borders
self.root.set_widget_border_characters('+', '+', '+', '+', '-', '|')
self.root.set_title('Themed App - Terminal Mode')
def toggle_theme(self):
themes = ['dark', 'light', 'terminal']
current_index = themes.index(self.current_theme)
next_index = (current_index + 1) % len(themes)
self.current_theme = themes[next_index]
self.apply_theme(self.current_theme)
self.status.set_text(f'Theme: {self.current_theme}')
def run(self):
self.content.set_text('Welcome to the themed application!\n\nThis demonstrates various color schemes and styling options.')
self.status.set_text(f'Theme: {self.current_theme}')
self.root.start()
# Usage
app = ThemedApplication()
app.run()Install with Tessl CLI
npx tessl i tessl/pypi-py-cui