Danke für das Interesse! Fehlerberichte, Übersetzungen, neue Ausgabeformate und Verbesserungen sind alle willkommen. Beiträge auf Deutsch und Englisch sind gleichermaßen in Ordnung.
Contributions in English are equally welcome – just open the issue or pull request in whichever language you are comfortable with.
git clone https://github.com/DerAlexmann/qr-code-generator.git
cd qr-code-generator
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activate
pip install -r requirements.txt -r requirements-dev.txtProgramm starten:
python qr_generator.pyruff check . # Linting
python -m pytest # TestsBeides läuft auch automatisch in der CI (siehe .github/workflows/ci.yml) –
lokal geht es nur schneller.
Bitte zusätzlich das Programm starten und den geänderten Bereich einmal von Hand durchspielen. Die Tests prüfen die Datenstrukturen und die erzeugten Dateien, nicht die Bedienung.
Important
Wer an der Erzeugung der Codes etwas ändert, sollte einen fertigen QR-Code tatsächlich mit einem Lesegerät scannen. Ein Code kann tadellos aussehen und trotzdem unlesbar sein; die Tests können das nicht ersetzen.
Die Anwendung ist eine einzige Datei, qr_generator.py. Das ist Absicht:
Herunterladen, starten, fertig – ohne Installation. Bitte diesen Aufbau
beibehalten. Daneben liegt nur QR-Code-Generator.pyw, ein kurzer Starter für
den Doppelklick unter Windows.
Grober Aufbau der Datei von oben nach unten:
| Abschnitt | Inhalt |
|---|---|
| Abhängigkeiten | qrcode und Pillow, jeweils über ein HAS_...-Flag |
THEMES |
Farbpaletten hell/dunkel, apply_theme() |
| Sprachumschaltung | Translator, Einstellungen lesen und schreiben |
| Ablageort | programm_ordner() – Skript- bzw. EXE-Ordner |
| Format- und Optionstabellen | FORMATE, FEHLERKORREKTUR, QROptionen |
| Prüfung | optionen_pruefen(), kontrast_warnung() |
| Erzeugung | matrix_erzeugen(), bild_erzeugen(), svg_erzeugen() |
| Speichern | qr_speichern(), endung_ergaenzen(), dateiname_vorschlagen() |
| Kommandozeile | argumente_parser(), cli_main() |
| Bausteine der Oberfläche | faerben(), FlatButton, make_card, ScrollBereich |
QRApp |
Hauptfenster mit den drei Reitern |
TRANSLATIONS |
Sprachtabelle, ganz am Ende |
- Schreibweise wie im Rest der Datei: vier Leerzeichen Einrückung, Zeilen bis 100 Zeichen, sprechende deutsche Bezeichner.
- Kommentare kommen ohne Umlaute aus, sichtbare Texte benutzen sie normal.
- Neue Abhängigkeiten nur, wenn es gar nicht anders geht.
- Die Kernfunktionen kennen keine Oberfläche: Sie nehmen
QROptionenentgegen und geben Daten zurück. Nur so bleiben Kommandozeile und Fenster gleichwertig.
- In
FORMATEeinenFormat-Eintrag anlegen: Endung, Beschreibung und die Fähigkeiten (vektor,alpha,max_kante,pillow_name). - Falls das Format Besonderheiten beim Speichern braucht,
speicherargumente()ergänzen; für Farbmodus und Transparenz istbild_fuer_format()zuständig. - Die Beschreibung in
TRANSLATIONSübersetzen – sie erscheint im Reiter „Erklärungen" und bei--formate. - Einen erzeugten Code mit einem Lesegerät prüfen. Verlustbehaftete Formate sind hier heikler als verlustfreie.
Auswahlfeld, Hilfetexte und die Formatübersicht lesen alle aus FORMATE und
aktualisieren sich von selbst.
Quellsprache ist Deutsch: der deutsche Text im Code ist der Schlüssel.
- Kürzel und Anzeigename in
LANGUAGE_NAMESeintragen, z. B."fr": "Français". - In
TRANSLATIONSeinen Eintrag"fr": { ... }anlegen und übersetzen.
Regeln:
- Nicht übersetzte Zeilen erscheinen automatisch auf Deutsch. Eine unvollständige Tabelle ist also unproblematisch – lieber wenige gute Übersetzungen als viele maschinelle.
- Platzhalter in geschweiften Klammern –
{pfad},{format},{fehler}… – müssen in der Übersetzung unverändert vorkommen. Ihre Reihenfolge im Satz ist frei.python -m pytestprüft das. - Auch die Beschreibungen in
FORMATEundFEHLERKORREKTURwerden zur Laufzeit übersetzt, obwohl sie nicht wörtlich in einem_( ... )stehen. Der Testtest_uebersetzungen.pysammelt beides ein.
In THEMES eine weitere Palette anlegen, die exakt dieselben Schlüssel
enthält wie die vorhandenen. apply_theme() schreibt die Werte per
globals().update() in die Modulvariablen; der übrige Code benutzt einfach
BG, CARD, TEXT … und muss vom Umschalten nichts wissen.
Genau wegen dieses Musters ist die Ruff-Regel F821 (undefined name) in
pyproject.toml abgeschaltet – die Farbnamen entstehen erst zur Laufzeit.
Important
Neue Widgets bitte über faerben( ... ) anlegen. Die Funktion merkt sich
zu jedem Widget, welche Rolle seine Farben haben (bg="CARD", fg="TEXT" …).
Ein Wechsel des Farbschemas färbt daraufhin die vorhandenen Bedienelemente um,
statt das Fenster neu aufzubauen – das war vorher als Zucken sichtbar. Ein
Widget, das mit fest eingesetzten Farben angelegt wird, bleibt beim Umschalten
in der alten Farbe stehen.
Kurze, aussagekräftige Betreffzeile im Imperativ, gern mit Präfix:
formate: JPEG-Qualität war nicht einstellbar
i18n: französische Übersetzung ergänzt
docs: Installationshinweis für Linux
.github/workflows/release.yml baut bei einem Versions-Tag automatisch eine
Windows-EXE mit PyInstaller. Lokal geht das so:
pip install pyinstaller
pyinstaller --noconfirm --onefile --windowed --name "QR-Code-Generator" --copy-metadata qrcode qr_generator.pyNote
Im --onefile-Modus entpackt PyInstaller das Programm bei jedem Start in
einen temporären Ordner und löscht ihn beim Beenden wieder. Damit die
Einstellungen das überleben, fragt programm_ordner() sys.frozen ab und
legt qr-code-generator.json im gepackten Zustand neben der EXE ab statt
neben __file__. Aus demselben Grund beginnt der Speichern-Dialog dort.
tests/test_ablageort.py wacht darüber.
Note
--copy-metadata qrcode nimmt die Paketdaten mit, aus denen der Reiter
„Info & Copyright" die Versionsnummer liest: qrcode führt seit Fassung 8
kein __version__ mehr. Ohne den Schalter steht dort „eingebettet" statt der
Nummer – funktional ändert das nichts. Pillow braucht ihn nicht, weil es
seine Version selbst mitführt.
Note
--windowed unterdrückt das Konsolenfenster hinter der Oberfläche. Die
Kommandozeile funktioniert in dieser Fassung weiterhin und schreibt auch
Dateien, nur ihre Meldungen sieht man dann nicht. Wer die EXE vor allem im
Terminal einsetzt, lässt den Schalter weg.
Für dieses Projekt gilt der Verhaltenskodex.
Mit einem Beitrag stimmen Sie zu, dass er unter der MIT-Lizenz veröffentlicht wird.
Copyright © 2026 Alexander Unverhau · Erstellt mit Unterstützung von
Claude AI (Anthropic), siehe NOTICE. Der Hinweis auf die
KI-Unterstützung steht der Transparenz halber überall dort, wo auch der
Copyright-Vermerk steht. Wer den Kopf von qr_generator.py, den Reiter
Info & Copyright oder die NOTICE bearbeitet, sollte ihn deshalb bitte stehen
lassen. Die LICENSE bleibt bewusst wortgleich beim MIT-Text, damit GitHub die
Lizenz weiterhin automatisch erkennt.