vgi


Namevgi JSON
Version 1.0.0 PyPI version JSON
download
home_pagehttps://github.com/vgi-team/vgi
SummaryProfessional Modern GUI Library for Python - Create stunning applications with ease
upload_time2025-08-08 22:44:23
maintainerNone
docs_urlNone
authorVGI Team
requires_python>=3.8
licenseNone
keywords gui ui interface modern professional desktop application framework
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # VGI - Professional Modern GUI Library for Python

VGI (Visual GUI Interface) is a comprehensive, modern GUI framework for Python designed to create stunning, professional desktop applications with ease. Built on top of Tkinter but providing a much more powerful and intuitive API, VGI offers advanced styling, theming, animations, and a rich set of components that rival the best GUI frameworks available.

## Key Features

### Modern Design Philosophy
- **Clean, Modern Interface**: Professional-grade UI components with contemporary design patterns
- **Responsive Layouts**: Flexible layout system that adapts to different screen sizes and resolutions
- **Professional Themes**: Built-in themes including light, dark, and professional styles
- **Customizable Styling**: Comprehensive styling system with CSS-like properties

### Advanced Component Library
- **Rich Widget Set**: Over 30 professionally designed components
- **Input Validation**: Built-in validation system with real-time feedback
- **Data Visualization**: Integrated charting and graphing capabilities
- **Advanced Layouts**: Sophisticated layout managers (VBox, HBox, Grid, Stack)

### Developer Experience
- **Intuitive API**: Simple, consistent interface that's easy to learn and use
- **Event-Driven Architecture**: Robust event handling system
- **Type Safety**: Full type hints for excellent IDE support
- **Comprehensive Documentation**: Extensive examples and tutorials

### Performance & Reliability
- **High Performance**: Optimized rendering and efficient memory usage
- **Cross-Platform**: Works seamlessly on Windows, macOS, and Linux
- **Stable Foundation**: Built on proven Tkinter technology with modern enhancements
- **Production Ready**: Suitable for commercial applications

## Installation

### From PyPI (Recommended)

```bash
pip install vgi
```

### From Source

```bash
git clone https://github.com/vgi-team/vgi.git
cd vgi
pip install -e .
```

### Requirements

- Python 3.8 or higher
- Tkinter (usually included with Python)
- Pillow (automatically installed)
- NumPy (automatically installed)

## Quick Start

### Basic Application

```python
import vgi

# Create application
app = vgi.Application(theme="modern_light")

# Create main window
window = app.create_window(title="My VGI App", size=(800, 600))

# Create layout container
container = vgi.VBox(padding=20, spacing=15)

# Add components
title = vgi.Heading1("Welcome to VGI!")
container.add(title)

button = vgi.PrimaryButton(
    text="Click Me!",
    on_click=lambda: print("Button clicked!")
)
container.add(button)

# Add container to window
window.add_widget(container, fill="both", expand=True)

# Run application
app.run()
```

### Form Example with Validation

```python
import vgi

app = vgi.Application()
window = app.create_window(title="Contact Form", size=(500, 400))

# Create form layout
form = vgi.Grid(columns=2, spacing=10, padding=20)

# Name field
form.add(vgi.Label("Name:"), row=0, column=0, sticky="e")
name_input = vgi.Input(
    placeholder="Enter your name",
    validator=vgi.Validator().required().min_length(2)
)
form.add(name_input, row=0, column=1, sticky="ew")

# Email field
form.add(vgi.Label("Email:"), row=1, column=0, sticky="e")
email_input = vgi.EmailInput(placeholder="Enter your email")
form.add(email_input, row=1, column=1, sticky="ew")

# Message field
form.add(vgi.Label("Message:"), row=2, column=0, sticky="ne")
message_input = vgi.TextArea(
    placeholder="Enter your message...",
    validator=vgi.Validator().required().min_length(10)
)
form.add(message_input, row=2, column=1, sticky="ew")

# Buttons
button_container = vgi.HBox(spacing=10)
button_container.add(vgi.SecondaryButton("Cancel"))
button_container.add(vgi.PrimaryButton("Submit"))

form.add(button_container, row=3, column=0, columnspan=2, sticky="e")

# Configure grid
form.set_column_weight(1, 1)

window.add_widget(form, fill="both", expand=True)
app.run()
```

## Core Components

### Layout Containers

#### VBox - Vertical Layout
```python
vbox = vgi.VBox(spacing=10, align="stretch")
vbox.add(vgi.Label("First item"))
vbox.add(vgi.Label("Second item"))
vbox.add(vgi.Button("Third item"), expand=True)
```

#### HBox - Horizontal Layout
```python
hbox = vgi.HBox(spacing=10, align="center")
hbox.add(vgi.Button("Left"))
hbox.add(vgi.Button("Center"), expand=True)
hbox.add(vgi.Button("Right"))
```

#### Grid - Flexible Grid Layout
```python
grid = vgi.Grid(rows=3, columns=3, spacing=5)
grid.add(vgi.Button("1,1"), row=0, column=0)
grid.add(vgi.Button("Span"), row=0, column=1, columnspan=2)
grid.add(vgi.Button("2,1"), row=1, column=0, rowspan=2)
```

#### Stack - Layered Layout
```python
stack = vgi.Stack()
stack.add(vgi.Label("Page 1"), name="page1")
stack.add(vgi.Label("Page 2"), name="page2")
stack.show("page1")  # Show specific page
```

### Input Components

#### Basic Input Fields
```python
# Text input with placeholder
text_input = vgi.Input(placeholder="Enter text...")

# Email input with validation
email_input = vgi.EmailInput(placeholder="your@email.com")

# Password input
password_input = vgi.PasswordInput(placeholder="Password")

# Number input with range
number_input = vgi.NumberInput(min_value=0, max_value=100)

# Multi-line text area
text_area = vgi.TextArea(placeholder="Enter message...")
```

#### Input Validation
```python
# Create validator
validator = (vgi.Validator()
    .required()
    .min_length(8)
    .regex(r'.*[A-Z].*', "Must contain uppercase")
    .regex(r'.*\d.*', "Must contain number"))

# Apply to input
password_input = vgi.PasswordInput(
    placeholder="Secure password",
    validator=validator,
    on_change=lambda text: print(f"Valid: {password_input.is_valid}")
)
```

### Button Components

#### Button Styles
```python
# Primary button (main action)
primary_btn = vgi.PrimaryButton("Save", on_click=save_data)

# Secondary button (secondary action)
secondary_btn = vgi.SecondaryButton("Cancel", on_click=cancel)

# Outline button (tertiary action)
outline_btn = vgi.OutlineButton("Options", on_click=show_options)

# Danger button (destructive action)
danger_btn = vgi.DangerButton("Delete", on_click=delete_item)
```

#### Button Sizes
```python
small_btn = vgi.Button("Small", size="small")
medium_btn = vgi.Button("Medium", size="medium")
large_btn = vgi.Button("Large", size="large")
```

#### Button States
```python
# Loading state
loading_btn = vgi.Button("Processing...", loading=True)

# Disabled state
disabled_btn = vgi.Button("Disabled", disabled=True)

# With icon (requires icon implementation)
icon_btn = vgi.Button("Save", icon="save", icon_position="left")
```

### Display Components

#### Labels and Text
```python
# Heading levels
h1 = vgi.Heading1("Main Title")
h2 = vgi.Heading2("Section Title")
h3 = vgi.Heading3("Subsection")

# Regular label
label = vgi.Label("Regular text", text_color="#333333")

# Caption text
caption = vgi.Caption("Small descriptive text")

# Clickable link
link = vgi.Link("Click here", on_click=handle_click)

# Wrapped text
wrapped = vgi.Label(
    "This is a long text that will wrap automatically",
    wrap=True
)
```

#### Containers and Panels
```python
# Basic container
container = vgi.Container(padding=16)

# Styled panel with border
panel = vgi.Panel(title="Settings", border=True, padding=20)

# Simple frame (no styling)
frame = vgi.Frame()

# Scrollable container
scrollable = vgi.Container(scrollable=True, padding=10)
```

## Theming and Styling

### Built-in Themes

```python
# Available themes
app = vgi.Application(theme="modern_light")    # Default light theme
app = vgi.Application(theme="modern_dark")     # Dark theme
app = vgi.Application(theme="professional")    # Professional/corporate theme

# Switch themes at runtime
app.set_theme("modern_dark")
```

### Custom Styling

```python
# Style individual components
button = vgi.Button("Styled Button")
button.set_style(
    background_color="#FF6B6B",
    text_color="#FFFFFF",
    border_radius=8,
    padding=(12, 24),
    font_weight="bold"
)

# Create custom theme
custom_theme = app.theme_manager.create_custom_theme(
    "my_theme", 
    base_theme="modern_light"
)
custom_theme.set_widget_style("button", "background_color", "#4ECDC4")
app.set_theme("my_theme")
```

### Color System

```python
# Using Color class
primary_color = vgi.Color.from_hex("#007ACC")
darker_primary = primary_color.darken(0.2)
lighter_primary = primary_color.lighten(0.2)

# Color palettes
palette = vgi.ColorPalette.create_material_palette()
dark_palette = vgi.ColorPalette.create_dark_palette()

# Apply palette to theme
theme = vgi.Theme("Custom Theme")
theme.set_palette(palette)
```

## Advanced Features

### Event Handling

```python
class MyHandler:
    def __init__(self):
        self.button = vgi.Button("Click me")
        
        # Multiple event handlers
        self.button.on("clicked", self.on_click)
        self.button.on("mouse_enter", self.on_hover)
        self.button.on("mouse_leave", self.on_leave)
    
    def on_click(self, event):
        print(f"Button {event.source.id} was clicked!")
    
    def on_hover(self, event):
        event.source.set_style(background_color="#E3F2FD")
    
    def on_leave(self, event):
        event.source.set_style(background_color="#2196F3")
```

### Animation System

```python
# Simple fade in animation
button = vgi.Button("Animated")
fade_in = vgi.Transition.fade_in(button, duration=0.5)
fade_in.start()

# Custom animation
animation = vgi.Animation(
    button,
    duration=1.0,
    x=100,
    y=50,
    scale_x=1.2,
    scale_y=1.2,
    easing="ease_out_bounce"
)
animation.start()

# Animation with callbacks
def on_complete(anim):
    print("Animation finished!")

pulse = vgi.Transition.pulse(button, duration=0.3)
pulse.on_complete = on_complete
pulse.start()
```

### Data Binding and Validation

```python
# Form with comprehensive validation
class RegistrationForm:
    def __init__(self):
        self.form = vgi.Grid(columns=2, spacing=10)
        
        # Username with custom validation
        self.username = vgi.Input(
            placeholder="Username",
            validator=vgi.Validator()
                .required()
                .min_length(3)
                .max_length(20)
                .regex(r'^[a-zA-Z0-9_]+$', "Only letters, numbers, underscore")
        )
        
        # Email validation
        self.email = vgi.EmailInput(placeholder="Email address")
        
        # Password with strength requirements
        self.password = vgi.PasswordInput(
            placeholder="Password",
            validator=vgi.Validator.create_password_validator(min_length=8)
        )
        
        # Confirm password
        self.confirm_password = vgi.PasswordInput(
            placeholder="Confirm password",
            validator=vgi.Validator().custom(
                lambda x: x == self.password.value,
                "Passwords must match"
            )
        )
        
        self.build_form()
    
    def build_form(self):
        fields = [
            ("Username:", self.username),
            ("Email:", self.email),
            ("Password:", self.password),
            ("Confirm:", self.confirm_password)
        ]
        
        for i, (label, field) in enumerate(fields):
            self.form.add(vgi.Label(label), row=i, column=0, sticky="e")
            self.form.add(field, row=i, column=1, sticky="ew")
        
        # Submit button - only enabled when all fields valid
        submit_btn = vgi.PrimaryButton("Register", on_click=self.submit)
        self.form.add(submit_btn, row=len(fields), column=1, sticky="e")
    
    def submit(self):
        if all(field.is_valid for field in [self.username, self.email, 
                                           self.password, self.confirm_password]):
            print("Registration successful!")
        else:
            print("Please fix validation errors")
```

## Advanced Components

### Data Display Components

```python
# Table with data
table = vgi.Table(
    columns=["Name", "Age", "Email"],
    data=[
        ["John Doe", 30, "john@example.com"],
        ["Jane Smith", 25, "jane@example.com"]
    ]
)

# Data grid with sorting/filtering
grid = vgi.DataGrid()
grid.set_columns([
    {"key": "name", "title": "Name", "sortable": True},
    {"key": "age", "title": "Age", "sortable": True, "type": "number"},
    {"key": "email", "title": "Email", "sortable": True}
])
grid.set_data(data_list)

# Tree view
tree = vgi.TreeView()
root_node = tree.add_node("Root")
child_node = root_node.add_child("Child 1")
child_node.add_child("Grandchild")
```

### Charts and Visualization

```python
# Line chart
line_chart = vgi.LineChart(
    data={
        "x": [1, 2, 3, 4, 5],
        "y": [10, 25, 30, 45, 60]
    },
    title="Sales Over Time"
)

# Bar chart
bar_chart = vgi.BarChart(
    data={
        "categories": ["Q1", "Q2", "Q3", "Q4"],
        "values": [100, 150, 200, 175]
    },
    title="Quarterly Results"
)

# Pie chart
pie_chart = vgi.PieChart(
    data={
        "Desktop": 45,
        "Mobile": 35,
        "Tablet": 20
    },
    title="Platform Usage"
)
```

### Dialog and Modal Components

```python
# Message boxes
vgi.MessageBox.show("Operation completed successfully!", "Success", "info")
vgi.MessageBox.show("Are you sure?", "Confirmation", "warning")
vgi.MessageBox.show("Error occurred!", "Error", "error")

# File dialogs
filename = vgi.FileDialog.open_file(
    title="Open Document",
    filetypes=[("Text files", "*.txt"), ("All files", "*.*")]
)

save_path = vgi.FileDialog.save_file(
    title="Save Document",
    defaultextension=".txt"
)

# Custom dialog
class SettingsDialog(vgi.Dialog):
    def __init__(self, parent):
        super().__init__(parent, title="Settings", size=(400, 300))
        self.build_ui()
    
    def build_ui(self):
        content = vgi.VBox(padding=20, spacing=15)
        
        # Settings options
        content.add(vgi.Label("Application Settings"))
        content.add(vgi.Checkbox("Enable notifications"))
        content.add(vgi.Checkbox("Auto-save documents"))
        
        # Buttons
        buttons = vgi.HBox(spacing=10)
        buttons.add(vgi.SecondaryButton("Cancel", on_click=self.close))
        buttons.add(vgi.PrimaryButton("OK", on_click=self.apply))
        
        content.add(buttons)
        self.add_widget(content)
```

## Application Architecture

### Model-View-Controller Pattern

```python
class Model:
    def __init__(self):
        self.data = []
        self.observers = []
    
    def add_observer(self, observer):
        self.observers.append(observer)
    
    def notify_observers(self):
        for observer in self.observers:
            observer.update()
    
    def add_item(self, item):
        self.data.append(item)
        self.notify_observers()

class View:
    def __init__(self, model, controller):
        self.model = model
        self.controller = controller
        self.model.add_observer(self)
        self.build_ui()
    
    def build_ui(self):
        self.window = vgi.Window(title="MVC Example")
        self.container = vgi.VBox(padding=20)
        
        # Input area
        self.input = vgi.Input(placeholder="Enter item")
        self.add_btn = vgi.PrimaryButton(
            "Add", 
            on_click=lambda: self.controller.add_item(self.input.value)
        )
        
        # List display
        self.list_container = vgi.VBox(spacing=5)
        
        # Layout
        input_row = vgi.HBox(spacing=10)
        input_row.add(self.input, expand=True)
        input_row.add(self.add_btn)
        
        self.container.add(input_row)
        self.container.add(self.list_container)
        
        self.window.add_widget(self.container, fill="both", expand=True)
    
    def update(self):
        # Refresh list display
        self.list_container.clear()
        for item in self.model.data:
            self.list_container.add(vgi.Label(item))

class Controller:
    def __init__(self, model):
        self.model = model
    
    def add_item(self, item):
        if item.strip():
            self.model.add_item(item)

# Usage
model = Model()
controller = Controller(model)
view = View(model, controller)
```

### Plugin Architecture

```python
class PluginManager:
    def __init__(self, app):
        self.app = app
        self.plugins = {}
    
    def register_plugin(self, name, plugin_class):
        plugin = plugin_class(self.app)
        self.plugins[name] = plugin
        plugin.initialize()
    
    def get_plugin(self, name):
        return self.plugins.get(name)

class BasePlugin:
    def __init__(self, app):
        self.app = app
    
    def initialize(self):
        pass
    
    def create_menu_items(self):
        return []

class ThemePlugin(BasePlugin):
    def initialize(self):
        # Add theme menu items
        pass
    
    def create_menu_items(self):
        return [
            vgi.MenuItem("Light Theme", on_click=self.set_light_theme),
            vgi.MenuItem("Dark Theme", on_click=self.set_dark_theme)
        ]

# Usage
app = vgi.Application()
plugin_manager = PluginManager(app)
plugin_manager.register_plugin("themes", ThemePlugin)
```

## Performance Optimization

### Efficient Rendering

```python
# Use containers efficiently
container = vgi.VBox()

# Batch updates
container.begin_update()  # Suspend layout updates
for i in range(100):
    container.add(vgi.Label(f"Item {i}"))
container.end_update()  # Resume and apply all updates

# Virtual scrolling for large lists
large_list = vgi.VirtualListView(
    item_count=10000,
    item_height=30,
    render_item=lambda index: vgi.Label(f"Item {index}")
)

# Lazy loading
def load_data_chunk(start, end):
    # Load data only when needed
    return data[start:end]

lazy_container = vgi.LazyContainer(
    total_items=1000,
    chunk_size=50,
    load_chunk=load_data_chunk
)
```

### Memory Management

```python
# Clean up resources
class DataView:
    def __init__(self):
        self.observers = []
        self.timers = []
    
    def cleanup(self):
        # Remove event handlers
        for observer in self.observers:
            observer.disconnect()
        
        # Stop timers
        for timer in self.timers:
            timer.stop()
        
        # Clear references
        self.observers.clear()
        self.timers.clear()

# Use weak references for callbacks
import weakref

class WeakCallback:
    def __init__(self, obj, method_name):
        self.obj_ref = weakref.ref(obj)
        self.method_name = method_name
    
    def __call__(self, *args, **kwargs):
        obj = self.obj_ref()
        if obj is not None:
            method = getattr(obj, self.method_name)
            return method(*args, **kwargs)
```

## Testing

### Unit Testing Components

```python
import unittest
import vgi

class TestButton(unittest.TestCase):
    def setUp(self):
        self.app = vgi.Application()
        self.button = vgi.Button("Test Button")
    
    def test_button_text(self):
        self.assertEqual(self.button.text, "Test Button")
    
    def test_button_click(self):
        clicked = False
        
        def on_click():
            nonlocal clicked
            clicked = True
        
        self.button.on_click(on_click)
        self.button.click()
        self.assertTrue(clicked)
    
    def test_button_styling(self):
        self.button.set_style(background_color="#FF0000")
        self.assertEqual(self.button.get_style("background_color"), "#FF0000")
    
    def tearDown(self):
        self.app.quit()

class TestLayout(unittest.TestCase):
    def setUp(self):
        self.app = vgi.Application()
        self.container = vgi.VBox(spacing=10)
    
    def test_add_widgets(self):
        widget1 = vgi.Label("Widget 1")
        widget2 = vgi.Label("Widget 2")
        
        self.container.add(widget1)
        self.container.add(widget2)
        
        self.assertEqual(len(self.container.children), 2)
        self.assertIn(widget1, self.container.children)
        self.assertIn(widget2, self.container.children)
    
    def test_remove_widget(self):
        widget = vgi.Label("Test Widget")
        self.container.add(widget)
        self.container.remove(widget)
        
        self.assertEqual(len(self.container.children), 0)
        self.assertNotIn(widget, self.container.children)

if __name__ == '__main__':
    unittest.main()
```

### Integration Testing

```python
import vgi

def test_full_application():
    """Test complete application workflow."""
    app = vgi.Application()
    window = app.create_window(title="Test App")
    
    # Create form
    form = vgi.VBox(spacing=10)
    name_input = vgi.Input(placeholder="Name")
    email_input = vgi.EmailInput(placeholder="Email")
    submit_btn = vgi.PrimaryButton("Submit")
    
    form.add(name_input)
    form.add(email_input)
    form.add(submit_btn)
    
    window.add_widget(form)
    
    # Simulate user input
    name_input.value = "John Doe"
    email_input.value = "john@example.com"
    
    # Verify values
    assert name_input.value == "John Doe"
    assert email_input.value == "john@example.com"
    assert email_input.is_valid
    
    # Simulate button click
    submitted = False
    def on_submit():
        global submitted
        submitted = True
    
    submit_btn.on_click(on_submit)
    submit_btn.click()
    
    assert submitted
    print("Integration test passed!")
    
    app.quit()

if __name__ == '__main__':
    test_full_application()
```

## Deployment

### Creating Executable Applications

```python
# setup.py for PyInstaller
from setuptools import setup

setup(
    name="MyVGIApp",
    version="1.0.0",
    py_modules=["main"],
    install_requires=["vgi>=1.0.0"],
    entry_points={
        "console_scripts": [
            "myapp=main:main",
        ],
    },
)
```

```bash
# Using PyInstaller
pip install pyinstaller
pyinstaller --onefile --windowed main.py

# Using cx_Freeze
pip install cx_freeze
python setup.py build

# Using auto-py-to-exe (GUI for PyInstaller)
pip install auto-py-to-exe
auto-py-to-exe
```

### Distribution

```python
# setup.py for distribution
from setuptools import setup, find_packages

setup(
    name="my-vgi-application",
    version="1.0.0",
    packages=find_packages(),
    install_requires=[
        "vgi>=1.0.0",
    ],
    entry_points={
        "gui_scripts": [
            "myapp=myapp.main:main",
        ],
    },
    classifiers=[
        "Development Status :: 5 - Production/Stable",
        "Intended Audience :: End Users/Desktop",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3.11",
        "Topic :: Desktop Environment",
    ],
)
```

## Examples and Tutorials

### Complete Application Examples

The VGI repository includes comprehensive examples:

- **Basic Example**: Simple application demonstrating core features
- **Layout Showcase**: All layout types with interactive examples
- **Theme Demo**: Theme switching and customization
- **Component Gallery**: All components with live examples
- **Professional App**: Full-featured business application
- **Animation Demo**: Showcase of animation capabilities
- **Form Builder**: Dynamic form creation tool
- **Data Visualization**: Charts and graphs examples
- **Plugin System**: Extensible application architecture

### Running Examples

```bash
# Install VGI with examples
pip install vgi[examples]

# Run the main demo launcher
python -m vgi.examples.demo

# Run specific examples
python -m vgi.examples.basic_example
python -m vgi.examples.layout_showcase
python -m vgi.examples.theme_demo
```

## API Reference

### Core Classes

#### Application
Main application class managing windows, themes, and global resources.

**Methods:**
- `create_window(title, size, **kwargs)`: Create new window
- `set_theme(theme_name)`: Change application theme
- `run()`: Start application main loop
- `quit()`: Close application

#### Window
Top-level window container.

**Methods:**
- `add_widget(widget, **layout_options)`: Add widget to window
- `show()`: Show window
- `hide()`: Hide window
- `center()`: Center window on screen
- `set_icon(icon_path)`: Set window icon

#### Widget
Base class for all UI components.

**Properties:**
- `visible`: Widget visibility
- `enabled`: Widget enabled state
- `position`: Widget position
- `size`: Widget size
- `style`: Widget style dictionary

**Methods:**
- `set_style(**kwargs)`: Set style properties
- `on(event_name, handler)`: Add event handler
- `emit(event_name, **kwargs)`: Emit event
- `focus()`: Set focus to widget

### Component Classes

#### Button
Interactive button component.

**Properties:**
- `text`: Button text
- `style`: Button style ("primary", "secondary", etc.)
- `size`: Button size ("small", "medium", "large")
- `loading`: Loading state
- `disabled`: Disabled state

**Methods:**
- `click()`: Programmatically trigger click
- `on_click(handler)`: Set click handler

#### Input
Text input component with validation.

**Properties:**
- `value`: Input value
- `placeholder`: Placeholder text
- `validator`: Validation rules
- `is_valid`: Validation state
- `readonly`: Read-only state

**Methods:**
- `clear()`: Clear input value
- `select_all()`: Select all text
- `focus()`: Set focus to input

#### Layout Containers

**VBox**: Vertical layout
**HBox**: Horizontal layout
**Grid**: Grid layout
**Stack**: Layered layout

Common properties:
- `spacing`: Space between children
- `padding`: Internal padding
- `align`: Child alignment

### Styling Classes

#### Theme
Complete application theme.

**Methods:**
- `set_widget_style(widget_type, property, value)`
- `get_widget_styles(widget_type)`
- `set_global_style(property, value)`

#### Color
Color representation and manipulation.

**Methods:**
- `from_hex(hex_string)`: Create from hex
- `from_name(color_name)`: Create from name
- `lighten(amount)`: Lighten color
- `darken(amount)`: Darken color
- `mix(other_color, ratio)`: Mix colors

### Animation Classes

#### Animation
Property animation over time.

**Parameters:**
- `target`: Widget to animate
- `duration`: Animation duration
- `easing`: Easing function
- `**properties`: Properties to animate

**Methods:**
- `start()`: Start animation
- `pause()`: Pause animation
- `stop()`: Stop animation

#### Transition
Pre-built transition effects.

**Static Methods:**
- `fade_in(widget, duration)`
- `slide_in_left(widget, duration)`
- `scale_in(widget, duration)`
- `pulse(widget, duration)`

## Best Practices

### Application Structure

```python
# Recommended project structure
myapp/
├── __init__.py
├── main.py              # Application entry point
├── models/              # Data models
│   ├── __init__.py
│   └── user.py
├── views/               # UI components
│   ├── __init__.py
│   ├── main_window.py
│   └── dialogs/
├── controllers/         # Business logic
│   ├── __init__.py
│   └── user_controller.py
├── resources/           # Assets
│   ├── images/
│   ├── icons/
│   └── themes/
└── tests/              # Test files
    ├── __init__.py
    └── test_views.py
```

### Code Organization

```python
# main.py - Clean application entry point
import vgi
from views.main_window import MainWindow
from controllers.app_controller import AppController

def main():
    app = vgi.Application(theme="modern_light")
    controller = AppController(app)
    main_window = MainWindow(controller)
    
    app.add_window(main_window)
    app.run()

if __name__ == "__main__":
    main()

# views/main_window.py - Separate UI definition
import vgi

class MainWindow(vgi.Window):
    def __init__(self, controller):
        super().__init__(title="My Application", size=(800, 600))
        self.controller = controller
        self.build_ui()
    
    def build_ui(self):
        # UI construction logic
        pass
```

### Performance Guidelines

1. **Use appropriate containers**: Choose the right layout for your needs
2. **Batch updates**: Group multiple changes together
3. **Lazy loading**: Load data only when needed
4. **Efficient event handling**: Avoid excessive event handlers
5. **Resource cleanup**: Properly dispose of resources

### Accessibility

```python
# Keyboard navigation
button.set_style(focusable=True)
button.on("key_press", handle_key_press)

# Screen reader support
label.set_style(
    accessible_name="User Name Input",
    accessible_description="Enter your full name"
)

# High contrast support
if app.is_high_contrast_mode():
    app.set_theme("high_contrast")
```

## Contributing

We welcome contributions to VGI! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.

### Development Setup

```bash
# Clone repository
git clone https://github.com/vgi-team/vgi.git
cd vgi

# Create virtual environment
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install development dependencies
pip install -e .[dev]

# Run tests
python -m pytest

# Run examples
python -m vgi.examples.demo
```

### Code Style

We use Black for code formatting and follow PEP 8 guidelines.

```bash
# Format code
black .

# Check style
flake8 .

# Type checking
mypy vgi/
```

## License

VGI is released under the MIT License. See [LICENSE](LICENSE) file for details.

## Support

- **Documentation**: [https://vgi.readthedocs.io/](https://vgi.readthedocs.io/)
- **GitHub Issues**: [https://github.com/vgi-team/vgi/issues](https://github.com/vgi-team/vgi/issues)
- **Discussions**: [https://github.com/vgi-team/vgi/discussions](https://github.com/vgi-team/vgi/discussions)
- **Email**: support@vgi.dev

## Changelog

### Version 1.0.0 (Initial Release)

- Complete widget library with 30+ components
- Advanced layout system (VBox, HBox, Grid, Stack)
- Professional theming system with built-in themes
- Comprehensive styling with CSS-like properties
- Animation and transition system
- Form validation framework
- Event-driven architecture
- Type safety with full type hints
- Comprehensive documentation and examples
- Cross-platform compatibility
- Performance optimizations

## Acknowledgments

VGI builds upon the solid foundation of Tkinter while providing a modern, professional interface. We thank the Python community and all contributors who have made this project possible.

---

**VGI - Elevating Python GUI Development to Professional Standards**

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/vgi-team/vgi",
    "name": "vgi",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "gui, ui, interface, modern, professional, desktop, application, framework",
    "author": "VGI Team",
    "author_email": "contact@vgi.dev",
    "download_url": "https://files.pythonhosted.org/packages/bb/fa/852be4783f39f2af5e6cdd238b33c5e07361d61c1ac290774d895a3624b2/vgi-1.0.0.tar.gz",
    "platform": null,
    "description": "# VGI - Professional Modern GUI Library for Python\r\n\r\nVGI (Visual GUI Interface) is a comprehensive, modern GUI framework for Python designed to create stunning, professional desktop applications with ease. Built on top of Tkinter but providing a much more powerful and intuitive API, VGI offers advanced styling, theming, animations, and a rich set of components that rival the best GUI frameworks available.\r\n\r\n## Key Features\r\n\r\n### Modern Design Philosophy\r\n- **Clean, Modern Interface**: Professional-grade UI components with contemporary design patterns\r\n- **Responsive Layouts**: Flexible layout system that adapts to different screen sizes and resolutions\r\n- **Professional Themes**: Built-in themes including light, dark, and professional styles\r\n- **Customizable Styling**: Comprehensive styling system with CSS-like properties\r\n\r\n### Advanced Component Library\r\n- **Rich Widget Set**: Over 30 professionally designed components\r\n- **Input Validation**: Built-in validation system with real-time feedback\r\n- **Data Visualization**: Integrated charting and graphing capabilities\r\n- **Advanced Layouts**: Sophisticated layout managers (VBox, HBox, Grid, Stack)\r\n\r\n### Developer Experience\r\n- **Intuitive API**: Simple, consistent interface that's easy to learn and use\r\n- **Event-Driven Architecture**: Robust event handling system\r\n- **Type Safety**: Full type hints for excellent IDE support\r\n- **Comprehensive Documentation**: Extensive examples and tutorials\r\n\r\n### Performance & Reliability\r\n- **High Performance**: Optimized rendering and efficient memory usage\r\n- **Cross-Platform**: Works seamlessly on Windows, macOS, and Linux\r\n- **Stable Foundation**: Built on proven Tkinter technology with modern enhancements\r\n- **Production Ready**: Suitable for commercial applications\r\n\r\n## Installation\r\n\r\n### From PyPI (Recommended)\r\n\r\n```bash\r\npip install vgi\r\n```\r\n\r\n### From Source\r\n\r\n```bash\r\ngit clone https://github.com/vgi-team/vgi.git\r\ncd vgi\r\npip install -e .\r\n```\r\n\r\n### Requirements\r\n\r\n- Python 3.8 or higher\r\n- Tkinter (usually included with Python)\r\n- Pillow (automatically installed)\r\n- NumPy (automatically installed)\r\n\r\n## Quick Start\r\n\r\n### Basic Application\r\n\r\n```python\r\nimport vgi\r\n\r\n# Create application\r\napp = vgi.Application(theme=\"modern_light\")\r\n\r\n# Create main window\r\nwindow = app.create_window(title=\"My VGI App\", size=(800, 600))\r\n\r\n# Create layout container\r\ncontainer = vgi.VBox(padding=20, spacing=15)\r\n\r\n# Add components\r\ntitle = vgi.Heading1(\"Welcome to VGI!\")\r\ncontainer.add(title)\r\n\r\nbutton = vgi.PrimaryButton(\r\n    text=\"Click Me!\",\r\n    on_click=lambda: print(\"Button clicked!\")\r\n)\r\ncontainer.add(button)\r\n\r\n# Add container to window\r\nwindow.add_widget(container, fill=\"both\", expand=True)\r\n\r\n# Run application\r\napp.run()\r\n```\r\n\r\n### Form Example with Validation\r\n\r\n```python\r\nimport vgi\r\n\r\napp = vgi.Application()\r\nwindow = app.create_window(title=\"Contact Form\", size=(500, 400))\r\n\r\n# Create form layout\r\nform = vgi.Grid(columns=2, spacing=10, padding=20)\r\n\r\n# Name field\r\nform.add(vgi.Label(\"Name:\"), row=0, column=0, sticky=\"e\")\r\nname_input = vgi.Input(\r\n    placeholder=\"Enter your name\",\r\n    validator=vgi.Validator().required().min_length(2)\r\n)\r\nform.add(name_input, row=0, column=1, sticky=\"ew\")\r\n\r\n# Email field\r\nform.add(vgi.Label(\"Email:\"), row=1, column=0, sticky=\"e\")\r\nemail_input = vgi.EmailInput(placeholder=\"Enter your email\")\r\nform.add(email_input, row=1, column=1, sticky=\"ew\")\r\n\r\n# Message field\r\nform.add(vgi.Label(\"Message:\"), row=2, column=0, sticky=\"ne\")\r\nmessage_input = vgi.TextArea(\r\n    placeholder=\"Enter your message...\",\r\n    validator=vgi.Validator().required().min_length(10)\r\n)\r\nform.add(message_input, row=2, column=1, sticky=\"ew\")\r\n\r\n# Buttons\r\nbutton_container = vgi.HBox(spacing=10)\r\nbutton_container.add(vgi.SecondaryButton(\"Cancel\"))\r\nbutton_container.add(vgi.PrimaryButton(\"Submit\"))\r\n\r\nform.add(button_container, row=3, column=0, columnspan=2, sticky=\"e\")\r\n\r\n# Configure grid\r\nform.set_column_weight(1, 1)\r\n\r\nwindow.add_widget(form, fill=\"both\", expand=True)\r\napp.run()\r\n```\r\n\r\n## Core Components\r\n\r\n### Layout Containers\r\n\r\n#### VBox - Vertical Layout\r\n```python\r\nvbox = vgi.VBox(spacing=10, align=\"stretch\")\r\nvbox.add(vgi.Label(\"First item\"))\r\nvbox.add(vgi.Label(\"Second item\"))\r\nvbox.add(vgi.Button(\"Third item\"), expand=True)\r\n```\r\n\r\n#### HBox - Horizontal Layout\r\n```python\r\nhbox = vgi.HBox(spacing=10, align=\"center\")\r\nhbox.add(vgi.Button(\"Left\"))\r\nhbox.add(vgi.Button(\"Center\"), expand=True)\r\nhbox.add(vgi.Button(\"Right\"))\r\n```\r\n\r\n#### Grid - Flexible Grid Layout\r\n```python\r\ngrid = vgi.Grid(rows=3, columns=3, spacing=5)\r\ngrid.add(vgi.Button(\"1,1\"), row=0, column=0)\r\ngrid.add(vgi.Button(\"Span\"), row=0, column=1, columnspan=2)\r\ngrid.add(vgi.Button(\"2,1\"), row=1, column=0, rowspan=2)\r\n```\r\n\r\n#### Stack - Layered Layout\r\n```python\r\nstack = vgi.Stack()\r\nstack.add(vgi.Label(\"Page 1\"), name=\"page1\")\r\nstack.add(vgi.Label(\"Page 2\"), name=\"page2\")\r\nstack.show(\"page1\")  # Show specific page\r\n```\r\n\r\n### Input Components\r\n\r\n#### Basic Input Fields\r\n```python\r\n# Text input with placeholder\r\ntext_input = vgi.Input(placeholder=\"Enter text...\")\r\n\r\n# Email input with validation\r\nemail_input = vgi.EmailInput(placeholder=\"your@email.com\")\r\n\r\n# Password input\r\npassword_input = vgi.PasswordInput(placeholder=\"Password\")\r\n\r\n# Number input with range\r\nnumber_input = vgi.NumberInput(min_value=0, max_value=100)\r\n\r\n# Multi-line text area\r\ntext_area = vgi.TextArea(placeholder=\"Enter message...\")\r\n```\r\n\r\n#### Input Validation\r\n```python\r\n# Create validator\r\nvalidator = (vgi.Validator()\r\n    .required()\r\n    .min_length(8)\r\n    .regex(r'.*[A-Z].*', \"Must contain uppercase\")\r\n    .regex(r'.*\\d.*', \"Must contain number\"))\r\n\r\n# Apply to input\r\npassword_input = vgi.PasswordInput(\r\n    placeholder=\"Secure password\",\r\n    validator=validator,\r\n    on_change=lambda text: print(f\"Valid: {password_input.is_valid}\")\r\n)\r\n```\r\n\r\n### Button Components\r\n\r\n#### Button Styles\r\n```python\r\n# Primary button (main action)\r\nprimary_btn = vgi.PrimaryButton(\"Save\", on_click=save_data)\r\n\r\n# Secondary button (secondary action)\r\nsecondary_btn = vgi.SecondaryButton(\"Cancel\", on_click=cancel)\r\n\r\n# Outline button (tertiary action)\r\noutline_btn = vgi.OutlineButton(\"Options\", on_click=show_options)\r\n\r\n# Danger button (destructive action)\r\ndanger_btn = vgi.DangerButton(\"Delete\", on_click=delete_item)\r\n```\r\n\r\n#### Button Sizes\r\n```python\r\nsmall_btn = vgi.Button(\"Small\", size=\"small\")\r\nmedium_btn = vgi.Button(\"Medium\", size=\"medium\")\r\nlarge_btn = vgi.Button(\"Large\", size=\"large\")\r\n```\r\n\r\n#### Button States\r\n```python\r\n# Loading state\r\nloading_btn = vgi.Button(\"Processing...\", loading=True)\r\n\r\n# Disabled state\r\ndisabled_btn = vgi.Button(\"Disabled\", disabled=True)\r\n\r\n# With icon (requires icon implementation)\r\nicon_btn = vgi.Button(\"Save\", icon=\"save\", icon_position=\"left\")\r\n```\r\n\r\n### Display Components\r\n\r\n#### Labels and Text\r\n```python\r\n# Heading levels\r\nh1 = vgi.Heading1(\"Main Title\")\r\nh2 = vgi.Heading2(\"Section Title\")\r\nh3 = vgi.Heading3(\"Subsection\")\r\n\r\n# Regular label\r\nlabel = vgi.Label(\"Regular text\", text_color=\"#333333\")\r\n\r\n# Caption text\r\ncaption = vgi.Caption(\"Small descriptive text\")\r\n\r\n# Clickable link\r\nlink = vgi.Link(\"Click here\", on_click=handle_click)\r\n\r\n# Wrapped text\r\nwrapped = vgi.Label(\r\n    \"This is a long text that will wrap automatically\",\r\n    wrap=True\r\n)\r\n```\r\n\r\n#### Containers and Panels\r\n```python\r\n# Basic container\r\ncontainer = vgi.Container(padding=16)\r\n\r\n# Styled panel with border\r\npanel = vgi.Panel(title=\"Settings\", border=True, padding=20)\r\n\r\n# Simple frame (no styling)\r\nframe = vgi.Frame()\r\n\r\n# Scrollable container\r\nscrollable = vgi.Container(scrollable=True, padding=10)\r\n```\r\n\r\n## Theming and Styling\r\n\r\n### Built-in Themes\r\n\r\n```python\r\n# Available themes\r\napp = vgi.Application(theme=\"modern_light\")    # Default light theme\r\napp = vgi.Application(theme=\"modern_dark\")     # Dark theme\r\napp = vgi.Application(theme=\"professional\")    # Professional/corporate theme\r\n\r\n# Switch themes at runtime\r\napp.set_theme(\"modern_dark\")\r\n```\r\n\r\n### Custom Styling\r\n\r\n```python\r\n# Style individual components\r\nbutton = vgi.Button(\"Styled Button\")\r\nbutton.set_style(\r\n    background_color=\"#FF6B6B\",\r\n    text_color=\"#FFFFFF\",\r\n    border_radius=8,\r\n    padding=(12, 24),\r\n    font_weight=\"bold\"\r\n)\r\n\r\n# Create custom theme\r\ncustom_theme = app.theme_manager.create_custom_theme(\r\n    \"my_theme\", \r\n    base_theme=\"modern_light\"\r\n)\r\ncustom_theme.set_widget_style(\"button\", \"background_color\", \"#4ECDC4\")\r\napp.set_theme(\"my_theme\")\r\n```\r\n\r\n### Color System\r\n\r\n```python\r\n# Using Color class\r\nprimary_color = vgi.Color.from_hex(\"#007ACC\")\r\ndarker_primary = primary_color.darken(0.2)\r\nlighter_primary = primary_color.lighten(0.2)\r\n\r\n# Color palettes\r\npalette = vgi.ColorPalette.create_material_palette()\r\ndark_palette = vgi.ColorPalette.create_dark_palette()\r\n\r\n# Apply palette to theme\r\ntheme = vgi.Theme(\"Custom Theme\")\r\ntheme.set_palette(palette)\r\n```\r\n\r\n## Advanced Features\r\n\r\n### Event Handling\r\n\r\n```python\r\nclass MyHandler:\r\n    def __init__(self):\r\n        self.button = vgi.Button(\"Click me\")\r\n        \r\n        # Multiple event handlers\r\n        self.button.on(\"clicked\", self.on_click)\r\n        self.button.on(\"mouse_enter\", self.on_hover)\r\n        self.button.on(\"mouse_leave\", self.on_leave)\r\n    \r\n    def on_click(self, event):\r\n        print(f\"Button {event.source.id} was clicked!\")\r\n    \r\n    def on_hover(self, event):\r\n        event.source.set_style(background_color=\"#E3F2FD\")\r\n    \r\n    def on_leave(self, event):\r\n        event.source.set_style(background_color=\"#2196F3\")\r\n```\r\n\r\n### Animation System\r\n\r\n```python\r\n# Simple fade in animation\r\nbutton = vgi.Button(\"Animated\")\r\nfade_in = vgi.Transition.fade_in(button, duration=0.5)\r\nfade_in.start()\r\n\r\n# Custom animation\r\nanimation = vgi.Animation(\r\n    button,\r\n    duration=1.0,\r\n    x=100,\r\n    y=50,\r\n    scale_x=1.2,\r\n    scale_y=1.2,\r\n    easing=\"ease_out_bounce\"\r\n)\r\nanimation.start()\r\n\r\n# Animation with callbacks\r\ndef on_complete(anim):\r\n    print(\"Animation finished!\")\r\n\r\npulse = vgi.Transition.pulse(button, duration=0.3)\r\npulse.on_complete = on_complete\r\npulse.start()\r\n```\r\n\r\n### Data Binding and Validation\r\n\r\n```python\r\n# Form with comprehensive validation\r\nclass RegistrationForm:\r\n    def __init__(self):\r\n        self.form = vgi.Grid(columns=2, spacing=10)\r\n        \r\n        # Username with custom validation\r\n        self.username = vgi.Input(\r\n            placeholder=\"Username\",\r\n            validator=vgi.Validator()\r\n                .required()\r\n                .min_length(3)\r\n                .max_length(20)\r\n                .regex(r'^[a-zA-Z0-9_]+$', \"Only letters, numbers, underscore\")\r\n        )\r\n        \r\n        # Email validation\r\n        self.email = vgi.EmailInput(placeholder=\"Email address\")\r\n        \r\n        # Password with strength requirements\r\n        self.password = vgi.PasswordInput(\r\n            placeholder=\"Password\",\r\n            validator=vgi.Validator.create_password_validator(min_length=8)\r\n        )\r\n        \r\n        # Confirm password\r\n        self.confirm_password = vgi.PasswordInput(\r\n            placeholder=\"Confirm password\",\r\n            validator=vgi.Validator().custom(\r\n                lambda x: x == self.password.value,\r\n                \"Passwords must match\"\r\n            )\r\n        )\r\n        \r\n        self.build_form()\r\n    \r\n    def build_form(self):\r\n        fields = [\r\n            (\"Username:\", self.username),\r\n            (\"Email:\", self.email),\r\n            (\"Password:\", self.password),\r\n            (\"Confirm:\", self.confirm_password)\r\n        ]\r\n        \r\n        for i, (label, field) in enumerate(fields):\r\n            self.form.add(vgi.Label(label), row=i, column=0, sticky=\"e\")\r\n            self.form.add(field, row=i, column=1, sticky=\"ew\")\r\n        \r\n        # Submit button - only enabled when all fields valid\r\n        submit_btn = vgi.PrimaryButton(\"Register\", on_click=self.submit)\r\n        self.form.add(submit_btn, row=len(fields), column=1, sticky=\"e\")\r\n    \r\n    def submit(self):\r\n        if all(field.is_valid for field in [self.username, self.email, \r\n                                           self.password, self.confirm_password]):\r\n            print(\"Registration successful!\")\r\n        else:\r\n            print(\"Please fix validation errors\")\r\n```\r\n\r\n## Advanced Components\r\n\r\n### Data Display Components\r\n\r\n```python\r\n# Table with data\r\ntable = vgi.Table(\r\n    columns=[\"Name\", \"Age\", \"Email\"],\r\n    data=[\r\n        [\"John Doe\", 30, \"john@example.com\"],\r\n        [\"Jane Smith\", 25, \"jane@example.com\"]\r\n    ]\r\n)\r\n\r\n# Data grid with sorting/filtering\r\ngrid = vgi.DataGrid()\r\ngrid.set_columns([\r\n    {\"key\": \"name\", \"title\": \"Name\", \"sortable\": True},\r\n    {\"key\": \"age\", \"title\": \"Age\", \"sortable\": True, \"type\": \"number\"},\r\n    {\"key\": \"email\", \"title\": \"Email\", \"sortable\": True}\r\n])\r\ngrid.set_data(data_list)\r\n\r\n# Tree view\r\ntree = vgi.TreeView()\r\nroot_node = tree.add_node(\"Root\")\r\nchild_node = root_node.add_child(\"Child 1\")\r\nchild_node.add_child(\"Grandchild\")\r\n```\r\n\r\n### Charts and Visualization\r\n\r\n```python\r\n# Line chart\r\nline_chart = vgi.LineChart(\r\n    data={\r\n        \"x\": [1, 2, 3, 4, 5],\r\n        \"y\": [10, 25, 30, 45, 60]\r\n    },\r\n    title=\"Sales Over Time\"\r\n)\r\n\r\n# Bar chart\r\nbar_chart = vgi.BarChart(\r\n    data={\r\n        \"categories\": [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\r\n        \"values\": [100, 150, 200, 175]\r\n    },\r\n    title=\"Quarterly Results\"\r\n)\r\n\r\n# Pie chart\r\npie_chart = vgi.PieChart(\r\n    data={\r\n        \"Desktop\": 45,\r\n        \"Mobile\": 35,\r\n        \"Tablet\": 20\r\n    },\r\n    title=\"Platform Usage\"\r\n)\r\n```\r\n\r\n### Dialog and Modal Components\r\n\r\n```python\r\n# Message boxes\r\nvgi.MessageBox.show(\"Operation completed successfully!\", \"Success\", \"info\")\r\nvgi.MessageBox.show(\"Are you sure?\", \"Confirmation\", \"warning\")\r\nvgi.MessageBox.show(\"Error occurred!\", \"Error\", \"error\")\r\n\r\n# File dialogs\r\nfilename = vgi.FileDialog.open_file(\r\n    title=\"Open Document\",\r\n    filetypes=[(\"Text files\", \"*.txt\"), (\"All files\", \"*.*\")]\r\n)\r\n\r\nsave_path = vgi.FileDialog.save_file(\r\n    title=\"Save Document\",\r\n    defaultextension=\".txt\"\r\n)\r\n\r\n# Custom dialog\r\nclass SettingsDialog(vgi.Dialog):\r\n    def __init__(self, parent):\r\n        super().__init__(parent, title=\"Settings\", size=(400, 300))\r\n        self.build_ui()\r\n    \r\n    def build_ui(self):\r\n        content = vgi.VBox(padding=20, spacing=15)\r\n        \r\n        # Settings options\r\n        content.add(vgi.Label(\"Application Settings\"))\r\n        content.add(vgi.Checkbox(\"Enable notifications\"))\r\n        content.add(vgi.Checkbox(\"Auto-save documents\"))\r\n        \r\n        # Buttons\r\n        buttons = vgi.HBox(spacing=10)\r\n        buttons.add(vgi.SecondaryButton(\"Cancel\", on_click=self.close))\r\n        buttons.add(vgi.PrimaryButton(\"OK\", on_click=self.apply))\r\n        \r\n        content.add(buttons)\r\n        self.add_widget(content)\r\n```\r\n\r\n## Application Architecture\r\n\r\n### Model-View-Controller Pattern\r\n\r\n```python\r\nclass Model:\r\n    def __init__(self):\r\n        self.data = []\r\n        self.observers = []\r\n    \r\n    def add_observer(self, observer):\r\n        self.observers.append(observer)\r\n    \r\n    def notify_observers(self):\r\n        for observer in self.observers:\r\n            observer.update()\r\n    \r\n    def add_item(self, item):\r\n        self.data.append(item)\r\n        self.notify_observers()\r\n\r\nclass View:\r\n    def __init__(self, model, controller):\r\n        self.model = model\r\n        self.controller = controller\r\n        self.model.add_observer(self)\r\n        self.build_ui()\r\n    \r\n    def build_ui(self):\r\n        self.window = vgi.Window(title=\"MVC Example\")\r\n        self.container = vgi.VBox(padding=20)\r\n        \r\n        # Input area\r\n        self.input = vgi.Input(placeholder=\"Enter item\")\r\n        self.add_btn = vgi.PrimaryButton(\r\n            \"Add\", \r\n            on_click=lambda: self.controller.add_item(self.input.value)\r\n        )\r\n        \r\n        # List display\r\n        self.list_container = vgi.VBox(spacing=5)\r\n        \r\n        # Layout\r\n        input_row = vgi.HBox(spacing=10)\r\n        input_row.add(self.input, expand=True)\r\n        input_row.add(self.add_btn)\r\n        \r\n        self.container.add(input_row)\r\n        self.container.add(self.list_container)\r\n        \r\n        self.window.add_widget(self.container, fill=\"both\", expand=True)\r\n    \r\n    def update(self):\r\n        # Refresh list display\r\n        self.list_container.clear()\r\n        for item in self.model.data:\r\n            self.list_container.add(vgi.Label(item))\r\n\r\nclass Controller:\r\n    def __init__(self, model):\r\n        self.model = model\r\n    \r\n    def add_item(self, item):\r\n        if item.strip():\r\n            self.model.add_item(item)\r\n\r\n# Usage\r\nmodel = Model()\r\ncontroller = Controller(model)\r\nview = View(model, controller)\r\n```\r\n\r\n### Plugin Architecture\r\n\r\n```python\r\nclass PluginManager:\r\n    def __init__(self, app):\r\n        self.app = app\r\n        self.plugins = {}\r\n    \r\n    def register_plugin(self, name, plugin_class):\r\n        plugin = plugin_class(self.app)\r\n        self.plugins[name] = plugin\r\n        plugin.initialize()\r\n    \r\n    def get_plugin(self, name):\r\n        return self.plugins.get(name)\r\n\r\nclass BasePlugin:\r\n    def __init__(self, app):\r\n        self.app = app\r\n    \r\n    def initialize(self):\r\n        pass\r\n    \r\n    def create_menu_items(self):\r\n        return []\r\n\r\nclass ThemePlugin(BasePlugin):\r\n    def initialize(self):\r\n        # Add theme menu items\r\n        pass\r\n    \r\n    def create_menu_items(self):\r\n        return [\r\n            vgi.MenuItem(\"Light Theme\", on_click=self.set_light_theme),\r\n            vgi.MenuItem(\"Dark Theme\", on_click=self.set_dark_theme)\r\n        ]\r\n\r\n# Usage\r\napp = vgi.Application()\r\nplugin_manager = PluginManager(app)\r\nplugin_manager.register_plugin(\"themes\", ThemePlugin)\r\n```\r\n\r\n## Performance Optimization\r\n\r\n### Efficient Rendering\r\n\r\n```python\r\n# Use containers efficiently\r\ncontainer = vgi.VBox()\r\n\r\n# Batch updates\r\ncontainer.begin_update()  # Suspend layout updates\r\nfor i in range(100):\r\n    container.add(vgi.Label(f\"Item {i}\"))\r\ncontainer.end_update()  # Resume and apply all updates\r\n\r\n# Virtual scrolling for large lists\r\nlarge_list = vgi.VirtualListView(\r\n    item_count=10000,\r\n    item_height=30,\r\n    render_item=lambda index: vgi.Label(f\"Item {index}\")\r\n)\r\n\r\n# Lazy loading\r\ndef load_data_chunk(start, end):\r\n    # Load data only when needed\r\n    return data[start:end]\r\n\r\nlazy_container = vgi.LazyContainer(\r\n    total_items=1000,\r\n    chunk_size=50,\r\n    load_chunk=load_data_chunk\r\n)\r\n```\r\n\r\n### Memory Management\r\n\r\n```python\r\n# Clean up resources\r\nclass DataView:\r\n    def __init__(self):\r\n        self.observers = []\r\n        self.timers = []\r\n    \r\n    def cleanup(self):\r\n        # Remove event handlers\r\n        for observer in self.observers:\r\n            observer.disconnect()\r\n        \r\n        # Stop timers\r\n        for timer in self.timers:\r\n            timer.stop()\r\n        \r\n        # Clear references\r\n        self.observers.clear()\r\n        self.timers.clear()\r\n\r\n# Use weak references for callbacks\r\nimport weakref\r\n\r\nclass WeakCallback:\r\n    def __init__(self, obj, method_name):\r\n        self.obj_ref = weakref.ref(obj)\r\n        self.method_name = method_name\r\n    \r\n    def __call__(self, *args, **kwargs):\r\n        obj = self.obj_ref()\r\n        if obj is not None:\r\n            method = getattr(obj, self.method_name)\r\n            return method(*args, **kwargs)\r\n```\r\n\r\n## Testing\r\n\r\n### Unit Testing Components\r\n\r\n```python\r\nimport unittest\r\nimport vgi\r\n\r\nclass TestButton(unittest.TestCase):\r\n    def setUp(self):\r\n        self.app = vgi.Application()\r\n        self.button = vgi.Button(\"Test Button\")\r\n    \r\n    def test_button_text(self):\r\n        self.assertEqual(self.button.text, \"Test Button\")\r\n    \r\n    def test_button_click(self):\r\n        clicked = False\r\n        \r\n        def on_click():\r\n            nonlocal clicked\r\n            clicked = True\r\n        \r\n        self.button.on_click(on_click)\r\n        self.button.click()\r\n        self.assertTrue(clicked)\r\n    \r\n    def test_button_styling(self):\r\n        self.button.set_style(background_color=\"#FF0000\")\r\n        self.assertEqual(self.button.get_style(\"background_color\"), \"#FF0000\")\r\n    \r\n    def tearDown(self):\r\n        self.app.quit()\r\n\r\nclass TestLayout(unittest.TestCase):\r\n    def setUp(self):\r\n        self.app = vgi.Application()\r\n        self.container = vgi.VBox(spacing=10)\r\n    \r\n    def test_add_widgets(self):\r\n        widget1 = vgi.Label(\"Widget 1\")\r\n        widget2 = vgi.Label(\"Widget 2\")\r\n        \r\n        self.container.add(widget1)\r\n        self.container.add(widget2)\r\n        \r\n        self.assertEqual(len(self.container.children), 2)\r\n        self.assertIn(widget1, self.container.children)\r\n        self.assertIn(widget2, self.container.children)\r\n    \r\n    def test_remove_widget(self):\r\n        widget = vgi.Label(\"Test Widget\")\r\n        self.container.add(widget)\r\n        self.container.remove(widget)\r\n        \r\n        self.assertEqual(len(self.container.children), 0)\r\n        self.assertNotIn(widget, self.container.children)\r\n\r\nif __name__ == '__main__':\r\n    unittest.main()\r\n```\r\n\r\n### Integration Testing\r\n\r\n```python\r\nimport vgi\r\n\r\ndef test_full_application():\r\n    \"\"\"Test complete application workflow.\"\"\"\r\n    app = vgi.Application()\r\n    window = app.create_window(title=\"Test App\")\r\n    \r\n    # Create form\r\n    form = vgi.VBox(spacing=10)\r\n    name_input = vgi.Input(placeholder=\"Name\")\r\n    email_input = vgi.EmailInput(placeholder=\"Email\")\r\n    submit_btn = vgi.PrimaryButton(\"Submit\")\r\n    \r\n    form.add(name_input)\r\n    form.add(email_input)\r\n    form.add(submit_btn)\r\n    \r\n    window.add_widget(form)\r\n    \r\n    # Simulate user input\r\n    name_input.value = \"John Doe\"\r\n    email_input.value = \"john@example.com\"\r\n    \r\n    # Verify values\r\n    assert name_input.value == \"John Doe\"\r\n    assert email_input.value == \"john@example.com\"\r\n    assert email_input.is_valid\r\n    \r\n    # Simulate button click\r\n    submitted = False\r\n    def on_submit():\r\n        global submitted\r\n        submitted = True\r\n    \r\n    submit_btn.on_click(on_submit)\r\n    submit_btn.click()\r\n    \r\n    assert submitted\r\n    print(\"Integration test passed!\")\r\n    \r\n    app.quit()\r\n\r\nif __name__ == '__main__':\r\n    test_full_application()\r\n```\r\n\r\n## Deployment\r\n\r\n### Creating Executable Applications\r\n\r\n```python\r\n# setup.py for PyInstaller\r\nfrom setuptools import setup\r\n\r\nsetup(\r\n    name=\"MyVGIApp\",\r\n    version=\"1.0.0\",\r\n    py_modules=[\"main\"],\r\n    install_requires=[\"vgi>=1.0.0\"],\r\n    entry_points={\r\n        \"console_scripts\": [\r\n            \"myapp=main:main\",\r\n        ],\r\n    },\r\n)\r\n```\r\n\r\n```bash\r\n# Using PyInstaller\r\npip install pyinstaller\r\npyinstaller --onefile --windowed main.py\r\n\r\n# Using cx_Freeze\r\npip install cx_freeze\r\npython setup.py build\r\n\r\n# Using auto-py-to-exe (GUI for PyInstaller)\r\npip install auto-py-to-exe\r\nauto-py-to-exe\r\n```\r\n\r\n### Distribution\r\n\r\n```python\r\n# setup.py for distribution\r\nfrom setuptools import setup, find_packages\r\n\r\nsetup(\r\n    name=\"my-vgi-application\",\r\n    version=\"1.0.0\",\r\n    packages=find_packages(),\r\n    install_requires=[\r\n        \"vgi>=1.0.0\",\r\n    ],\r\n    entry_points={\r\n        \"gui_scripts\": [\r\n            \"myapp=myapp.main:main\",\r\n        ],\r\n    },\r\n    classifiers=[\r\n        \"Development Status :: 5 - Production/Stable\",\r\n        \"Intended Audience :: End Users/Desktop\",\r\n        \"License :: OSI Approved :: MIT License\",\r\n        \"Operating System :: OS Independent\",\r\n        \"Programming Language :: Python :: 3\",\r\n        \"Programming Language :: Python :: 3.8\",\r\n        \"Programming Language :: Python :: 3.9\",\r\n        \"Programming Language :: Python :: 3.10\",\r\n        \"Programming Language :: Python :: 3.11\",\r\n        \"Topic :: Desktop Environment\",\r\n    ],\r\n)\r\n```\r\n\r\n## Examples and Tutorials\r\n\r\n### Complete Application Examples\r\n\r\nThe VGI repository includes comprehensive examples:\r\n\r\n- **Basic Example**: Simple application demonstrating core features\r\n- **Layout Showcase**: All layout types with interactive examples\r\n- **Theme Demo**: Theme switching and customization\r\n- **Component Gallery**: All components with live examples\r\n- **Professional App**: Full-featured business application\r\n- **Animation Demo**: Showcase of animation capabilities\r\n- **Form Builder**: Dynamic form creation tool\r\n- **Data Visualization**: Charts and graphs examples\r\n- **Plugin System**: Extensible application architecture\r\n\r\n### Running Examples\r\n\r\n```bash\r\n# Install VGI with examples\r\npip install vgi[examples]\r\n\r\n# Run the main demo launcher\r\npython -m vgi.examples.demo\r\n\r\n# Run specific examples\r\npython -m vgi.examples.basic_example\r\npython -m vgi.examples.layout_showcase\r\npython -m vgi.examples.theme_demo\r\n```\r\n\r\n## API Reference\r\n\r\n### Core Classes\r\n\r\n#### Application\r\nMain application class managing windows, themes, and global resources.\r\n\r\n**Methods:**\r\n- `create_window(title, size, **kwargs)`: Create new window\r\n- `set_theme(theme_name)`: Change application theme\r\n- `run()`: Start application main loop\r\n- `quit()`: Close application\r\n\r\n#### Window\r\nTop-level window container.\r\n\r\n**Methods:**\r\n- `add_widget(widget, **layout_options)`: Add widget to window\r\n- `show()`: Show window\r\n- `hide()`: Hide window\r\n- `center()`: Center window on screen\r\n- `set_icon(icon_path)`: Set window icon\r\n\r\n#### Widget\r\nBase class for all UI components.\r\n\r\n**Properties:**\r\n- `visible`: Widget visibility\r\n- `enabled`: Widget enabled state\r\n- `position`: Widget position\r\n- `size`: Widget size\r\n- `style`: Widget style dictionary\r\n\r\n**Methods:**\r\n- `set_style(**kwargs)`: Set style properties\r\n- `on(event_name, handler)`: Add event handler\r\n- `emit(event_name, **kwargs)`: Emit event\r\n- `focus()`: Set focus to widget\r\n\r\n### Component Classes\r\n\r\n#### Button\r\nInteractive button component.\r\n\r\n**Properties:**\r\n- `text`: Button text\r\n- `style`: Button style (\"primary\", \"secondary\", etc.)\r\n- `size`: Button size (\"small\", \"medium\", \"large\")\r\n- `loading`: Loading state\r\n- `disabled`: Disabled state\r\n\r\n**Methods:**\r\n- `click()`: Programmatically trigger click\r\n- `on_click(handler)`: Set click handler\r\n\r\n#### Input\r\nText input component with validation.\r\n\r\n**Properties:**\r\n- `value`: Input value\r\n- `placeholder`: Placeholder text\r\n- `validator`: Validation rules\r\n- `is_valid`: Validation state\r\n- `readonly`: Read-only state\r\n\r\n**Methods:**\r\n- `clear()`: Clear input value\r\n- `select_all()`: Select all text\r\n- `focus()`: Set focus to input\r\n\r\n#### Layout Containers\r\n\r\n**VBox**: Vertical layout\r\n**HBox**: Horizontal layout\r\n**Grid**: Grid layout\r\n**Stack**: Layered layout\r\n\r\nCommon properties:\r\n- `spacing`: Space between children\r\n- `padding`: Internal padding\r\n- `align`: Child alignment\r\n\r\n### Styling Classes\r\n\r\n#### Theme\r\nComplete application theme.\r\n\r\n**Methods:**\r\n- `set_widget_style(widget_type, property, value)`\r\n- `get_widget_styles(widget_type)`\r\n- `set_global_style(property, value)`\r\n\r\n#### Color\r\nColor representation and manipulation.\r\n\r\n**Methods:**\r\n- `from_hex(hex_string)`: Create from hex\r\n- `from_name(color_name)`: Create from name\r\n- `lighten(amount)`: Lighten color\r\n- `darken(amount)`: Darken color\r\n- `mix(other_color, ratio)`: Mix colors\r\n\r\n### Animation Classes\r\n\r\n#### Animation\r\nProperty animation over time.\r\n\r\n**Parameters:**\r\n- `target`: Widget to animate\r\n- `duration`: Animation duration\r\n- `easing`: Easing function\r\n- `**properties`: Properties to animate\r\n\r\n**Methods:**\r\n- `start()`: Start animation\r\n- `pause()`: Pause animation\r\n- `stop()`: Stop animation\r\n\r\n#### Transition\r\nPre-built transition effects.\r\n\r\n**Static Methods:**\r\n- `fade_in(widget, duration)`\r\n- `slide_in_left(widget, duration)`\r\n- `scale_in(widget, duration)`\r\n- `pulse(widget, duration)`\r\n\r\n## Best Practices\r\n\r\n### Application Structure\r\n\r\n```python\r\n# Recommended project structure\r\nmyapp/\r\n\u251c\u2500\u2500 __init__.py\r\n\u251c\u2500\u2500 main.py              # Application entry point\r\n\u251c\u2500\u2500 models/              # Data models\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u2514\u2500\u2500 user.py\r\n\u251c\u2500\u2500 views/               # UI components\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u251c\u2500\u2500 main_window.py\r\n\u2502   \u2514\u2500\u2500 dialogs/\r\n\u251c\u2500\u2500 controllers/         # Business logic\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u2514\u2500\u2500 user_controller.py\r\n\u251c\u2500\u2500 resources/           # Assets\r\n\u2502   \u251c\u2500\u2500 images/\r\n\u2502   \u251c\u2500\u2500 icons/\r\n\u2502   \u2514\u2500\u2500 themes/\r\n\u2514\u2500\u2500 tests/              # Test files\r\n    \u251c\u2500\u2500 __init__.py\r\n    \u2514\u2500\u2500 test_views.py\r\n```\r\n\r\n### Code Organization\r\n\r\n```python\r\n# main.py - Clean application entry point\r\nimport vgi\r\nfrom views.main_window import MainWindow\r\nfrom controllers.app_controller import AppController\r\n\r\ndef main():\r\n    app = vgi.Application(theme=\"modern_light\")\r\n    controller = AppController(app)\r\n    main_window = MainWindow(controller)\r\n    \r\n    app.add_window(main_window)\r\n    app.run()\r\n\r\nif __name__ == \"__main__\":\r\n    main()\r\n\r\n# views/main_window.py - Separate UI definition\r\nimport vgi\r\n\r\nclass MainWindow(vgi.Window):\r\n    def __init__(self, controller):\r\n        super().__init__(title=\"My Application\", size=(800, 600))\r\n        self.controller = controller\r\n        self.build_ui()\r\n    \r\n    def build_ui(self):\r\n        # UI construction logic\r\n        pass\r\n```\r\n\r\n### Performance Guidelines\r\n\r\n1. **Use appropriate containers**: Choose the right layout for your needs\r\n2. **Batch updates**: Group multiple changes together\r\n3. **Lazy loading**: Load data only when needed\r\n4. **Efficient event handling**: Avoid excessive event handlers\r\n5. **Resource cleanup**: Properly dispose of resources\r\n\r\n### Accessibility\r\n\r\n```python\r\n# Keyboard navigation\r\nbutton.set_style(focusable=True)\r\nbutton.on(\"key_press\", handle_key_press)\r\n\r\n# Screen reader support\r\nlabel.set_style(\r\n    accessible_name=\"User Name Input\",\r\n    accessible_description=\"Enter your full name\"\r\n)\r\n\r\n# High contrast support\r\nif app.is_high_contrast_mode():\r\n    app.set_theme(\"high_contrast\")\r\n```\r\n\r\n## Contributing\r\n\r\nWe welcome contributions to VGI! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.\r\n\r\n### Development Setup\r\n\r\n```bash\r\n# Clone repository\r\ngit clone https://github.com/vgi-team/vgi.git\r\ncd vgi\r\n\r\n# Create virtual environment\r\npython -m venv venv\r\nsource venv/bin/activate  # On Windows: venv\\Scripts\\activate\r\n\r\n# Install development dependencies\r\npip install -e .[dev]\r\n\r\n# Run tests\r\npython -m pytest\r\n\r\n# Run examples\r\npython -m vgi.examples.demo\r\n```\r\n\r\n### Code Style\r\n\r\nWe use Black for code formatting and follow PEP 8 guidelines.\r\n\r\n```bash\r\n# Format code\r\nblack .\r\n\r\n# Check style\r\nflake8 .\r\n\r\n# Type checking\r\nmypy vgi/\r\n```\r\n\r\n## License\r\n\r\nVGI is released under the MIT License. See [LICENSE](LICENSE) file for details.\r\n\r\n## Support\r\n\r\n- **Documentation**: [https://vgi.readthedocs.io/](https://vgi.readthedocs.io/)\r\n- **GitHub Issues**: [https://github.com/vgi-team/vgi/issues](https://github.com/vgi-team/vgi/issues)\r\n- **Discussions**: [https://github.com/vgi-team/vgi/discussions](https://github.com/vgi-team/vgi/discussions)\r\n- **Email**: support@vgi.dev\r\n\r\n## Changelog\r\n\r\n### Version 1.0.0 (Initial Release)\r\n\r\n- Complete widget library with 30+ components\r\n- Advanced layout system (VBox, HBox, Grid, Stack)\r\n- Professional theming system with built-in themes\r\n- Comprehensive styling with CSS-like properties\r\n- Animation and transition system\r\n- Form validation framework\r\n- Event-driven architecture\r\n- Type safety with full type hints\r\n- Comprehensive documentation and examples\r\n- Cross-platform compatibility\r\n- Performance optimizations\r\n\r\n## Acknowledgments\r\n\r\nVGI builds upon the solid foundation of Tkinter while providing a modern, professional interface. We thank the Python community and all contributors who have made this project possible.\r\n\r\n---\r\n\r\n**VGI - Elevating Python GUI Development to Professional Standards**\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Professional Modern GUI Library for Python - Create stunning applications with ease",
    "version": "1.0.0",
    "project_urls": {
        "Bug Reports": "https://github.com/vgi-team/vgi/issues",
        "Documentation": "https://vgi.readthedocs.io/",
        "Homepage": "https://github.com/vgi-team/vgi",
        "Source": "https://github.com/vgi-team/vgi"
    },
    "split_keywords": [
        "gui",
        " ui",
        " interface",
        " modern",
        " professional",
        " desktop",
        " application",
        " framework"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cf6b00d2024ffc4973aa12298eae85d465ab9bccfe8b1497ddb941dbcebc6097",
                "md5": "73e446c932261f2b6f6100a372f5ded2",
                "sha256": "d3fc8770e0779d395775f1c073f704c12c5415e3c87cdcdab255560d5b555474"
            },
            "downloads": -1,
            "filename": "vgi-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "73e446c932261f2b6f6100a372f5ded2",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 73116,
            "upload_time": "2025-08-08T22:44:21",
            "upload_time_iso_8601": "2025-08-08T22:44:21.428889Z",
            "url": "https://files.pythonhosted.org/packages/cf/6b/00d2024ffc4973aa12298eae85d465ab9bccfe8b1497ddb941dbcebc6097/vgi-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bbfa852be4783f39f2af5e6cdd238b33c5e07361d61c1ac290774d895a3624b2",
                "md5": "db2dd3874333efb58c3a3d448f48a94b",
                "sha256": "e4b37a72fdab557f0fded762fc3067e173ca12074b63a528e97ce8d56b64c23f"
            },
            "downloads": -1,
            "filename": "vgi-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "db2dd3874333efb58c3a3d448f48a94b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 81885,
            "upload_time": "2025-08-08T22:44:23",
            "upload_time_iso_8601": "2025-08-08T22:44:23.615331Z",
            "url": "https://files.pythonhosted.org/packages/bb/fa/852be4783f39f2af5e6cdd238b33c5e07361d61c1ac290774d895a3624b2/vgi-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-08 22:44:23",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "vgi-team",
    "github_project": "vgi",
    "github_not_found": true,
    "lcname": "vgi"
}
        
Elapsed time: 1.78983s