| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- # -*- coding: utf-8 -*-
- """
- Trainer SubView: Validate (F5).
- Fuehrt eine Validierung durch und zeigt Ergebnisse:
- Fehler, Warnungen und GPU-Informationen.
- """
- from __future__ import annotations
- from textual.app import ComposeResult
- from textual.containers import Vertical
- from textual.widgets import Static, Button
- from trixy_core.tui.views.base import MainView
- from trixy_core.tui.widgets.status_table import StatusTable
- class TrainerValidateView(MainView):
- """F5 im Trainer-Kontext: Validierung."""
- TITLE = "Validierung"
- VIEW_ID = "trainer_validate"
- def __init__(self, **kwargs) -> None:
- super().__init__(**kwargs)
- self._trainer_data: dict = {}
- def set_trainer(self, trainer_data: dict) -> None:
- """Setzt die Trainer-Basisdaten."""
- self._trainer_data = trainer_data
- def compose(self) -> ComposeResult:
- with Vertical(classes="trainer-section"):
- yield Static(
- "[bold]Trainings-Validierung[/bold]\n"
- "Prueft Einstellungen, Dataset und GPU-Verfuegbarkeit.",
- classes="trainer-section-header",
- )
- yield Button("Validierung starten", id="trainer-validate-btn", variant="primary")
- with Vertical(id="trainer-validate-result", classes="trainer-section"):
- yield Static("", id="trainer-validate-status")
- yield StatusTable(id="trainer-validate-gpu")
- yield Static("", id="trainer-validate-errors")
- yield Static("", id="trainer-validate-warnings")
- async def on_activate(self) -> None:
- """Zuruecksetzen bei Aktivierung."""
- self.query_one("#trainer-validate-status", Static).update("")
- self.query_one("#trainer-validate-errors", Static).update("")
- self.query_one("#trainer-validate-warnings", Static).update("")
- self.query_one("#trainer-validate-gpu", StatusTable).update_data([])
- async def on_button_pressed(self, event: Button.Pressed) -> None:
- """Validierung starten."""
- if event.button.id != "trainer-validate-btn":
- return
- await self._run_validation()
- async def _run_validation(self) -> None:
- """Fuehrt die Validierung durch."""
- status = self.query_one("#trainer-validate-status", Static)
- errors_widget = self.query_one("#trainer-validate-errors", Static)
- warnings_widget = self.query_one("#trainer-validate-warnings", Static)
- gpu_table = self.query_one("#trainer-validate-gpu", StatusTable)
- if not self.connection:
- status.update("[red]Keine Verbindung[/red]")
- return
- trainer_id = self._trainer_data.get("trainer_id", "")
- if not trainer_id:
- status.update("[red]Kein Trainer ausgewaehlt[/red]")
- return
- # Erst Settings speichern (falls Settings-View Aenderungen hat)
- settings_view = self.app._view_map.get("trainer_settings") # type: ignore[attr-defined]
- if settings_view and hasattr(settings_view, "collect_settings"):
- settings = settings_view.collect_settings()
- if settings:
- await self.connection.write_trainer_settings(trainer_id, settings)
- status.update("[yellow]Validierung laeuft...[/yellow]")
- try:
- result = await self.connection.validate_trainer(trainer_id)
- except Exception as e:
- status.update(f"[red]Fehler: {e}[/red]")
- return
- if result is None:
- status.update("[red]Keine Antwort vom Server[/red]")
- return
- # Ergebnis anzeigen
- if result.valid:
- status.update("[green bold]Validierung erfolgreich[/green bold]")
- else:
- status.update("[red bold]Validierung fehlgeschlagen[/red bold]")
- # Fehler
- if result.errors:
- lines = "\n".join(f" [red]\u2718[/red] {e}" for e in result.errors)
- errors_widget.update(f"[bold]Fehler:[/bold]\n{lines}")
- else:
- errors_widget.update("")
- # Warnungen
- if result.warnings:
- lines = "\n".join(f" [yellow]\u26A0[/yellow] {w}" for w in result.warnings)
- warnings_widget.update(f"[bold]Warnungen:[/bold]\n{lines}")
- else:
- warnings_widget.update("")
- # GPU-Info
- gpu_rows = []
- if result.gpu_available:
- gpu_rows.append(("GPU", f"[green]{result.gpu_name}[/green]"))
- gpu_rows.append(("GPU-Speicher", f"{result.gpu_memory_mb:.0f} MB"))
- else:
- gpu_rows.append(("GPU", "[yellow]Nicht verfuegbar[/yellow]"))
- gpu_table.update_data(gpu_rows)
|