Seine Ansage
"da gehen noch die popups auf dem video monitor auf"
"einfach so programmieren das die popup auf dem fenster mittig vom main
fenster auf gehen"
Was falsch war
An sechs Stellen stand `max(0, x)`. Das sollte verhindern, dass ein Dialog
ausserhalb des Bildschirms aufgeht - klemmt aber jede NEGATIVE Koordinate
auf null. Bei ihm steht der zweite Monitor links (x = -1920): jedes Popup
sprang damit zurueck auf den Hauptbildschirm, obwohl das Programm nebenan
lief. Dazu kamen feste Versaetze wie "+120+140", die mit der Fenstergroesse
nichts zu tun hatten.
theme.mittig(dialog, ueber)
Eine Stelle fuer alle Dialoge: mittig ueber dem Elternfenster, etwas
oberhalb der Mitte (ein Drittel statt der Haelfte), damit der Blick dort
ist und die Mitte des Formulars frei bleibt.
Das ist zugleich die Antwort auf die Monitorfrage: steht das Programm auf
dem zweiten Bildschirm, geht der Dialog dort auf - ohne dass irgendwo ein
Monitor gesucht werden muss. Die Sonderbehandlung im Testlauf konnte
deshalb entfallen; geblieben ist dort nur der Verzicht auf grab_set.
theme.auf_bildschirm(x, y, breite, hoehe)
Begrenzt eine Position auf den GESAMTEN Desktop ueber alle Monitore
(SM_*VIRTUALSCREEN) statt auf den Hauptmonitor. Das war die eigentliche
Absicht hinter dem alten max(0, ...).
Gemessen statt geglaubt: Dialogmitte und Fenstermitte liegen 8 Pixel
auseinander (Fensterrahmen), der Dialog liegt innerhalb des Fensters. Steht
als Pruefung in pruef_darstellung.py.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax
Seine Ansage
"waere nun noch gut das mann in den einstellungen einstellen kann hell
oder dunkel oder automatik das fehlt sollte eigendlich drin sein"
Er hatte recht: beide Farbpaletten lagen laengst in theme.py, das Programm
folgte aber starr dem Windows-Theme. Jetzt steht die Wahl unter
Einstellungen -> Darstellung und wirkt SOFORT, nicht erst beim Neustart.
Umschalten heisst neu bauen
Die Farben stehen an ueber sechzig Stellen fest in den Widgets. Sie einzeln
nachzuziehen hiesse, ein Verzeichnis aller eingefaerbten Widgets zu fuehren
- und wer beim naechsten neuen Widget vergisst, es einzutragen, hat einen
hellen Fleck im dunklen Fenster, den niemand mehr findet. Neu bauen kann
nichts vergessen.
⚠️ Dabei gingen im ersten Versuch Kundenname und Rechnungsnummer verloren:
die _build_-Methoden legen ihre StringVars SELBST an, nach dem Neubau
standen leere da. Gesichert werden jetzt ALLE Tk-Variablen des Fensters,
nicht eine gepflegte Auswahl - wer spaeter ein Feld hinzufuegt, muss nichts
eintragen.
Titelleiste, Symbol und Logo gehen mit
Die Titelleiste gehoert Windows; sie folgt ueber
DWMWA_USE_IMMERSIVE_DARK_MODE. _dark_titlebar konnte bisher nur DUNKEL und
zeigt jetzt in beide Richtungen - vorher behielt man beim Wechsel auf hell
eine schwarze Leiste ueber einem hellen Fenster.
Sein Befund: "die svg fuer das dunkle heller machen weil die geht nun
unter" und "icon musst wenn es dunkel ist mit aendern auf das hellere".
Gemessen sind es zwei Farben: Petrol #004860 und ein fast schwarzes
#181818 - letzteres liegt genau auf der Kachelfarbe #15171b. Umgestellt
wird nur die HELLIGKEIT (L -> 1-L, gedeckelt bei 0.78), Farbton und
Saettigung bleiben: sonst waere es nicht mehr sein Logo. Betrifft
Wasserzeichen, Kopflogo und das Fenstersymbol; die aufgehellte ICO entsteht
beim Bauen.
menueleiste.py
Die selbstgebaute Menueleiste ist jetzt eine eigene Datei und liegt in
beiden Programmen gleich - das Steuerrechnungstool hatte noch das native
tk.Menu, das sich unter Windows nicht einfaerben laesst.
pruef_darstellung.py
Prueft die drei Modi, dass beim Umschalten NICHTS verlorengeht, und dass
danach kein Widget mehr eine Farbe der anderen Palette traegt - genau der
helle Fleck, den man sonst nie wiederfindet.
Nebenbei: die beiden Dauertimer melden beim Beenden kein
"invalid command name ..._api_pumpe" mehr. Ein Log, in dem beim normalen
Beenden immer zwei Fehler stehen, liest irgendwann niemand mehr.
Fassung 1.8.0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax