3.1 KiB
3.1 KiB
Copilot Plan: Windows GUI für Anwesenheit PDF Generator
Ziel
Eine Windows-GUI mit customtkinter als zweiter Entry-Point (gui.py) neben dem
bestehenden CLI (generate.py). Die GUI wrappt direkt die vorhandenen src/-Module
und verändert keine Business Logic.
Architektur
gui.py # GUI Entry-Point (customtkinter)
scripts/
create_icon.py # Einmaliges Script: erzeugt assets/icon.ico mit Pillow
assets/
icon.ico # Generiertes Icon (committed)
Bestehende Dateien die erweitert werden:
requirements.txt # + customtkinter>=5.2.0
requirements-dev.txt # + pyinstaller>=6.0.0
.gitignore # + build/, AnwesenheitPDF.spec, AnwesenheitPDF.exe
Nicht anzufassen:
generate.py, src/*.py, tests/, config.json, schema.json
Datenfluss
GUI-Eingabe (Datei, Monat)
→ der Ordner Input wird gescannt, befindet sich eine Exceldatei darin, wird diese als input verwendet
→ der Ordner template wird gescannt und eine darin befindliche pdf als template datei verwendet
→ validate() [src/validators.py]
→ Vorschau-Panel aktualisieren
→ Default wird der Ordner /output als zeil für die generierten PDFs verwendet.
→ Sind schon Dateien in output ist eine Hinweis in der GUI zu sehen und vor dem Start der generierung kommt ein Hinweis (im Hinweis kann der Inhalt des Ordners gelöscht werden)
→ für eine gewählte Exceldatei + Templatedatei werden automatisch die Preview zeilen angezeigt so wie in show_preview_and_confirm()
GUI-Bestätigung (Generieren)
→ extract_persons() [src/excel_reader.py]
→ extract_year_from_filename() [src/excel_reader.py]
→ für jede Person:
extract_attendance() [src/excel_reader.py]
fill_pdf() [src/pdf_filler.py]
→ Log-Panel: [OK] / [FEHLER] pro Person
Entwurfsentscheidungen
- Framework: customtkinter (modern, leichtgewichtig, Windows-nativ wirkend)
- CLI (
generate.py) bleibt vollständig unverändert config.jsonbleibt manuell bearbeitbar — kein Settings-Tab in der GUIshow_preview_and_confirm()ausvalidators.pywird nicht genutzt (CLI-only)_resource_path()Hilfsfunktion für PyInstaller-Kompatibilität (sys._MEIPASS)- Validierung + Generierung laufen in
threading.Thread(GUI bleibt responsiv) - GUI-Updates aus Threads nur via
self.after(0, callback)(thread-safe) .exelandet direkt im Root-Verzeichnis (keindist/-Unterordner)- Icon: Pillow-generierter Placeholder (
assets/icon.ico)
Packaging (kein Installer)
Build-Kommando (einmalig, nach Abschluss der Implementierung):
pyinstaller --onefile --windowed --distpath . --icon assets/icon.ico ^
--add-data "template;template" --add-data "config.json;." ^
--add-data "schema.json;." --add-data "assets;assets" ^
--name "AnwesenheitPDF" gui.py
Ergebnis: AnwesenheitPDF.exe nicht direkt im Projekt-Root, sondern mit allem was zum build der Exe benötigt wird im ordner /build und alles was zum ausführen der Exebenötigt wird im Ordner /dist.