CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-py-cui

A widget and grid based framework for building command line user interfaces in python.

Pending
Overview
Eval results
Files

colors-styling.mddocs/

Colors and Styling

Color system with predefined color pairs, custom color rules for syntax highlighting, border customization, and visual theming options.

Capabilities

Predefined Color Pairs

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)

Widget Color Configuration

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)

Color Rules for Text Highlighting

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)

Border Customization

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)

Advanced Color Patterns

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

docs

colors-styling.md

index.md

key-bindings.md

main-interface.md

popups.md

widgets.md

tile.json