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
107 lines
4.5 KiB
Python
107 lines
4.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Pruefstand: passt das VEROEFFENTLICHTE Release zu dem, was der Updater sucht?
|
|
|
|
DER FALL, DER DAZU GEFUEHRT HAT (06.09.2026)
|
|
--------------------------------------------
|
|
Das Release war angelegt, die EXE hing dran - und der Updater haette trotzdem
|
|
nie etwas gefunden. Der Anhang hiess `Rechnungstool-1.7.0.exe`; gesucht wird
|
|
aber `Rechnungstool.exe` (so steht es in version.EXE_NAME, und danach sucht
|
|
passendes_release). Die Nummer kommt erst beim ABLEGEN dazu.
|
|
|
|
Das Tueckische daran: nichts schlaegt fehl. Der Updater meldet freundlich
|
|
"Aktuell. Kein Update noetig." und startet die alte Fassung. Ein Update, das
|
|
stumm nie ankommt, ist schlimmer als eines, das laut scheitert.
|
|
|
|
Zweiter Fund derselben Runde: die Pruefsummen standen nur im Release-TEXT. Der
|
|
Updater liest sie aus einer angehaengten Datei `<exe>.sha256`. Ohne die prueft
|
|
er nur die Groesse - und eine unterwegs verfaelschte Datei hat genau die
|
|
richtige Groesse.
|
|
|
|
WAS HIER GEPRUEFT WIRD
|
|
----------------------
|
|
Gegen das echte Repository, nicht gegen einen Nachbau:
|
|
|
|
1. Zu der Nummer in version.py gibt es ein Release.
|
|
2. Es haengt eine Datei mit EXAKT dem Namen aus version.EXE_NAME an.
|
|
3. Es haengt die Pruefsumme `<exe>.sha256` an.
|
|
4. Die Summe darin ist die der angehaengten Datei - und die stimmt mit dem
|
|
ueberein, was hier zuletzt gebaut wurde (release/<exe>).
|
|
5. passendes_release() findet dieses Release auch wirklich.
|
|
|
|
Ohne Netz wird uebersprungen statt rot gemeldet: ein fehlender Anschluss ist
|
|
kein Fehler des Programms.
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
HIER = os.path.dirname(os.path.abspath(__file__))
|
|
sys.path.insert(0, HIER)
|
|
|
|
import updater # noqa: E402
|
|
import version # noqa: E402
|
|
|
|
fehler = []
|
|
|
|
|
|
def pruefe(bedingung, text):
|
|
zeile = (" OK | " if bedingung else "FEHLER | ") + text
|
|
kod = sys.stdout.encoding or "utf-8"
|
|
print(zeile.encode(kod, "replace").decode(kod))
|
|
if not bedingung:
|
|
fehler.append(text)
|
|
|
|
|
|
try:
|
|
releases = updater.releases_holen(version.REPOSITORY)
|
|
except Exception as e: # noqa: BLE001 - ohne Netz ist hier nichts zu pruefen
|
|
print(f"UEBERSPRUNGEN | Repository nicht erreichbar ({e})")
|
|
sys.exit(0)
|
|
|
|
marke = "v" + version.VERSION
|
|
dieses = next((r for r in releases if (r.get("tag_name") or "") == marke), None)
|
|
pruefe(dieses is not None, f"zu Fassung {version.VERSION} gibt es ein Release ({marke})")
|
|
if dieses is None:
|
|
print("ROT | ohne Release ist der Rest nicht pruefbar")
|
|
sys.exit(1)
|
|
|
|
roh = dieses.get("assets") or []
|
|
anhaenge = {a.get("name"): a for a in roh}
|
|
# Doppelte Namen: Forgejo laesst zwei Anhaenge mit demselben Namen zu. Beim
|
|
# Ersetzen einer Datei blieb die alte einmal stehen (07.09.2026), und welche
|
|
# von beiden der Updater dann laedt, ist Glueckssache - unter Umstaenden die
|
|
# alte, mit der falschen Pruefsumme daneben.
|
|
doppelt = sorted({a["name"] for a in roh
|
|
if sum(1 for b in roh if b["name"] == a["name"]) > 1})
|
|
pruefe(not doppelt, f"kein Anhang haengt doppelt am Release ({doppelt})")
|
|
print(f" (Anhaenge: {', '.join(sorted(anhaenge)) or 'keine'})")
|
|
|
|
pruefe(version.EXE_NAME in anhaenge,
|
|
f"der Anhang heisst genau {version.EXE_NAME} - danach sucht der Updater")
|
|
pruefe(version.EXE_NAME + ".sha256" in anhaenge,
|
|
f"die Pruefsumme haengt als {version.EXE_NAME}.sha256 dran")
|
|
|
|
# ---- Die Summe muss zur Datei passen, und zwar zu der gebauten ------------
|
|
gebaut = os.path.join(HIER, "release", version.EXE_NAME)
|
|
url_summe = updater.summe_aus_release(dieses, version.EXE_NAME)
|
|
if url_summe:
|
|
veroeffentlicht = updater.text_holen(url_summe).strip().split()[0]
|
|
if os.path.exists(gebaut):
|
|
pruefe(veroeffentlicht == updater.sha256(gebaut),
|
|
"die veroeffentlichte Summe ist die der zuletzt gebauten Datei")
|
|
else:
|
|
print(f" (release/{version.EXE_NAME} fehlt - Summe nicht "
|
|
f"gegenpruefbar, vorher: python bauen.py)")
|
|
pruefe(len(veroeffentlicht) == 64 and all(c in "0123456789abcdef" for c in veroeffentlicht),
|
|
f"und sie sieht aus wie eine SHA256 ({veroeffentlicht[:16]}...)")
|
|
|
|
# ---- Und findet der Updater das Release ueberhaupt? -----------------------
|
|
treffer = updater.passendes_release(releases, version.EXE_NAME)
|
|
pruefe(treffer is not None, "passendes_release findet ueberhaupt ein Release")
|
|
if treffer:
|
|
pruefe((treffer[0].get("tag_name") or "") == marke,
|
|
f"und zwar dieses hier ({treffer[0].get('tag_name')})")
|
|
|
|
if fehler:
|
|
print(f"ROT | {len(fehler)} Punkt(e) nicht erfuellt")
|
|
sys.exit(1)
|
|
print("GRUEN | Das Release ist so, wie der Updater es erwartet")
|