Launcher 2 — GUI specifikace (Python / customtkinter)¶
Tento soubor nahrazuje
main-app.mdpro Python verzi launcheru. Backend (FastAPI) zůstává beze změny — viz ostatní spec soubory.
Přehled¶
Desktop launcher kompletně v Pythonu (customtkinter). Distribuován jako
standalone .exe (PyInstaller, Windows) nebo .AppImage (Linux).
Nahrazuje původní Rust/egui launcher.
Technologický stack¶
| Vrstva | Technologie | Poznámka |
|---|---|---|
| GUI | customtkinter 5.2+ | Dark-themed widgets, ttk-based |
| HTTP | requests + threading | Async volání bez blokování UI |
| Barvy | colors.py modul |
Dynamicky přepisován při změně tématu |
| Nastavení | settings.py singleton |
JSON v %APPDATA%\Avaxis\launcher2\ |
| Témata | theme.py + 6 palet |
Live přepínání (rebuild okna) |
| Build | PyInstaller 6+ | Single-file .exe, ~21 MB |
Struktura souborů¶
desktop/launcher2/
├── main.py — vstupní bod, LoginWindow
├── main_window.py — MainWindow (menu lišta + screen routing + reload_theme)
├── screens.py — všechny obrazovky (Library, Help, Settings, Placeholder)
├── colors.py — aktuální paleta (přepisuje theme.apply_theme)
├── theme.py — 6 palet + apply_theme()
├── settings.py — SettingsManager singleton (load/save JSON)
├── api.py — HTTP wrapper (login, get_me, get_catalog_apps)
├── requirements.txt
└── plugins/ — výpočetní pluginy mzdy/DPH (L2.5+)
Spuštění¶
Build exe:
cd avax/
python -m PyInstaller avax-launcher2.spec --noconfirm
# výstup: dist/avax-launcher2.exe (~21 MB, self-contained)
Inicializační pořadí (main.py)¶
1. from settings import settings ← načte settings.json
2. from theme import apply_theme ← připraví paletový systém
3. apply_theme(settings.get("theme")) ← zapíše barvy do colors.*
4. import customtkinter, api, colors ← GUI moduly (čtou colors.*)
5. LoginWindow().mainloop() ← spustí aplikaci
Pořadí je kritické — apply_theme musí být zavolána před importem GUI modulů.
Flow přihlášení¶
LoginWindow
│ POST /auth/login → { access_token, refresh_token }
│ GET /auth/me → { email, name, company_name, system_role }
│
├─ [Úspěch] → LoginWindow.withdraw()
│ MainWindow(session, on_logout=_show_login)
│
└─ [Chyba] → zobrazit chybovou zprávu, tlačítko zpět na normal
Odhlášení:
MainWindow._logout()
├─ self.destroy() ← nejdřív destroy (Python 3.13 rule)
└─ _logout_cb() ← pak callback → LoginWindow.deiconify()
Menu lišta (46 px výška)¶
- Barva pozadí:
colors.BG0 [▶ AVAX]— tlačítko scolors.ACCENT, naviguje na Novinky- Nav tlačítka —
fg_color="transparent",hover_color=colors.BG2 - Dropdowny — floating
_Dropdown(CTkFrame), pozicovány přesplace() - Zavření dropdownu —
bind_all("<Button-1>"), kontrola hierarchie widgetů
Dropdownové menu Software¶
Dropdownové menu Nápověda¶
Dropdownové menu Jméno¶
👤 Můj profil
🏢 Detail účtu
⚙ Předvolby
📊 Moje předplatné
────────────────
🔧 Nastavení
────────────────
🚪 Odhlásit se
Obrazovky¶
Screen cache (lazy init)¶
Každá obrazovka se vytvoří jen jednou a ukládá do _cache: dict[str, CTkFrame].
Přepínání = pack_forget() + pack(). Při reload_theme() se cache zahodí
(celé okno se zničí a vytvoří znovu).
Přehled obrazovek¶
| Klíč | Třída | Stav | Popis |
|---|---|---|---|
library |
LibraryScreen |
✅ Funkční | Grid karet, live API, vyhledávání, refresh |
store |
PlaceholderScreen |
🔲 Placeholder | Katalog k zakoupení |
news |
PlaceholderScreen |
🔲 Placeholder | Novinky a blog |
chat |
PlaceholderScreen |
🔲 Placeholder | Interní chat (čeká F4) |
help_support |
HelpScreen |
✅ FAQ karty | Podpora, kontakt, provozní doba |
help_gdpr |
HelpScreen |
✅ FAQ karty | GDPR, výmaz, umístění dat |
help_contracts |
HelpScreen |
✅ FAQ karty | Smlouvy, fakturace |
help_system |
HelpScreen |
✅ FAQ karty | Verze, backend URL |
help_client |
HelpScreen |
✅ FAQ karty | O Avaxis, kontakt |
profile |
PlaceholderScreen |
🔲 Placeholder | Editace profilu (GET/PUT /auth/me) |
account |
PlaceholderScreen |
🔲 Placeholder | Info o firmě |
prefs |
PlaceholderScreen |
🔲 Placeholder | Správa uživatelů (jen admin) |
subscription |
PlaceholderScreen |
🔲 Placeholder | Aktivní předplatné |
settings |
SettingsScreen |
✅ Funkční | Témata, písmo, chování, URL |
Knihovna (LibraryScreen)¶
┌─ Header ─────────────────────────────────────────────────────┐
│ 📦 Knihovna aplikací [🔍 Hledat…] [↺] │
│ Aplikace dostupné pro vaši firmu │
└───────────────────────────────────────────────────────────────┘
┌─ Scrollable grid (3 sloupce) ────────────────────────────────┐
│ ┌─ App Card ──────┐ ┌─ App Card ──────┐ ┌─ App Card ───┐ │
│ │ [A] Název │ │ [B] Název │ │ │ │
│ │ v2.1 · 12MB │ │ v1.0 · 5MB │ │ │ │
│ │ [── Stáhnout ─] │ │ [── Stáhnout ─] │ │ │ │
│ └─────────────────┘ └─────────────────┘ └──────────────┘ │
└───────────────────────────────────────────────────────────────┘
Data: GET /catalog/apps (Authorization: Bearer token)
Vyhledávání: filtr přes name / slug / description (lokálně)
Refresh: smaže cache, znovu načte z API
Nastavení (SettingsScreen)¶
Sekce VZHLED¶
Barevné téma — 6 swatchů s radio výběrem, live přepnutí:
Po kliknutí →main_win.reload_theme(name) → okno se obnoví do 50 ms.
Velikost písma — small / normal / large (projeví se po restartu)
Sekce CHOVÁNͶ
- Při zavření okna:
quit/tray(tray dostupné v L2.4) - Spustit s Windows: switch → registry
HKCU\...\Run(jen v .exe)
Sekce PŘIHLÁŠENͶ
- Zapamatovat e-mail: switch →
settings.saved_emailpředvyplní login form
Sekce POKROČILɶ
- Backend URL: textové pole → uloží + aktualizuje
api.API_BASEihned
Live přepínání témat¶
# SettingsScreen._on_theme(name)
settings.set("theme", name)
main_win.reload_theme(name)
# MainWindow.reload_theme(name)
apply_theme(name) # colors.BG0 = nova_hodnota, ...
geom = self.geometry() # zachovat pozici a velikost
self.after(50, do_reload)
# do_reload()
self.destroy() # zničit staré okno
new_win = MainWindow(...) # nové okno čte colors.* (aktuální hodnoty)
new_win.geometry(geom)
new_win.show_screen("settings")
Klíč: import colors místo from colors import BG0 — modul se nečte jednou
při importu, ale vždy přes referenci colors.BG0 (vždy aktuální hodnota).
Barevná témata¶
| Název | BG0 | BG1 | ACCENT |
|---|---|---|---|
| dark_blue (výchozí) | #0d131f | #11192b | #3d8bff |
| dark | #111111 | #1a1a1a | #888888 |
| green | #0a140a | #0f1e0f | #2ecc71 |
| light | #c8c8d8 | #d8d8e8 | #2050cc |
| black | #000000 | #0a0a0a | #505050 |
| pink | #1f0a14 | #2a0f1e | #ff3d9a |
Paleta obsahuje: BG0, BG1, BG2, BG3, ACCENT, TEXT, TEXT_DIM, ERROR, GREEN, ORANGE
Settings soubor¶
Uloženo: %APPDATA%\Avaxis\launcher2\settings.json
{
"theme": "dark_blue",
"font_size": "normal",
"language": "cs",
"on_close": "quit",
"start_with_windows": false,
"backend_url": "http://192.168.1.55:8000",
"notifications": true,
"remember_login": true,
"saved_email": "",
"window_w": 1100,
"window_h": 700
}
Distribuce (Windows)¶
avax-launcher2.spec ← PyInstaller spec (v kořenu projektu)
├── pathex: desktop/launcher2/
├── datas: customtkinter package (témata + assety)
└── console: False (bez CMD okna)
dist/avax-launcher2.exe ← výstupní soubor (~21 MB)
WDAC (Windows Application Control) blokuje nepodepsané exe. Spuštění: pravý klik → Vlastnosti → Odblokovat, nebo spustit z terminálu. Pro produkci: OV code-signing certifikát (~5 000 Kč/rok).
Aktualizováno: 2026-04-25