Files

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.json bleibt manuell bearbeitbar — kein Settings-Tab in der GUI
  • show_preview_and_confirm() aus validators.py wird 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)
  • .exe landet direkt im Root-Verzeichnis (kein dist/-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.