#!/usr/bin/env python3 """ Example of using the refactored monitoring classes with NiceGUI's reactive system. This demonstrates how the bindable dataclasses automatically update the UI. """ from nicegui import ui, app from utils import GPUMonitor, SystemMonitor # Create monitor instances (bindable dataclasses) system_monitor = SystemMonitor() gpu_monitor = GPUMonitor() app.timer(2.0, system_monitor.update) app.timer(2.0, gpu_monitor.update) @ui.page('/') async def index_page(): """Example usage of monitoring classes with NiceGUI""" # Create UI that automatically updates when dataclass fields change with ui.card().classes('w-full'): ui.label('System Monitor').classes('text-h4') # CPU section - binds directly to dataclass fields with ui.row(): ui.label('CPU:') ui.label().bind_text_from(system_monitor, 'cpu_percent', lambda x: f'{x:.1f}%') ui.label().bind_text_from(system_monitor, 'cpu_model') # Memory section with ui.row(): ui.label('Memory:') ui.label().bind_text_from(system_monitor, 'memory_percent', lambda x: f'{x:.1f}%') ui.label().bind_text_from(system_monitor, 'memory_used', lambda x: f'{x / (1024**3):.1f} GB used') # Disk section with ui.row(): ui.label('Disk:') ui.label().bind_text_from(system_monitor, 'disk_percent', lambda x: f'{x:.1f}%') # Process count with ui.row(): ui.label('Processes:') ui.label().bind_text_from(system_monitor, 'process_count') # GPU Monitor section (if available) if gpu_monitor.available: with ui.card().classes('w-full mt-4'): ui.label('GPU Monitor').classes('text-h4') with ui.row(): ui.label('GPU:') ui.label().bind_text_from(gpu_monitor, 'gpu_name') ui.label().bind_text_from(gpu_monitor, 'vendor', lambda x: f'({x.value})') with ui.row(): ui.label('Usage:') ui.label().bind_text_from(gpu_monitor, 'usage', lambda x: f'{x:.1f}%') ui.label('Temp:') ui.label().bind_text_from(gpu_monitor, 'temperature', lambda x: f'{x:.1f}°C') with ui.row(): ui.label('Memory:') ui.label().bind_text_from(gpu_monitor, 'memory_percent', lambda x: f'{x:.1f}%') ui.label().bind_text_from(gpu_monitor, 'memory_used', lambda x: f'({(x / 1024.0):.2f} GB / {(gpu_monitor.memory_total / 1024.0):.2f} GB)') else: with ui.card().classes('w-full mt-4'): ui.label('No GPU detected').classes('text-h4') if __name__ in {"__main__", "__mp_main__"}: ui.run(port=8081, title='System Monitor Example')