From 20256d266c525347d929d261137f2b1df8beb658 Mon Sep 17 00:00:00 2001 From: Handy-Insel Date: Mon, 2 Nov 2026 14:01:57 +0100 Subject: [PATCH] Tests: Warten auf das sichtbare Hauptfenster als Schritt im Ablauf statt eigener update()-Schleife MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Auf dem langsamen Runner öffnete sich währenddessen der modale Einrichtungs-Assistent und hielt die Schleife fest (Hänger). Als Tk-Callback-Schritt läuft das Warten auch bei offenem Dialog weiter. Co-Authored-By: Claude Opus 5.5 --- tests/test_gui.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/test_gui.py b/tests/test_gui.py index 3932dbf..c078190 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -61,23 +61,23 @@ class Lauf: # eine evtl. geöffnete Fehlermeldung schließen, damit der Test nicht hängt self.root.after(100, self._meldungen_zu) self.root.report_callback_exception = melden - self._warten_bis_sichtbar() + self._sichtbar_seit: float | None = None - def _warten_bis_sichtbar(self, sekunden: float = 8.0): + def hauptfenster_sichtbar(self) -> bool: """Wie ein Mensch erst bedienen, wenn das Hauptfenster zu sehen ist: Unter Windows wird es beim - Start für den Taskleisten-Eintrag kurz aus- und wieder eingeblendet (unter Wine langsamer).""" - ende = time.time() + sekunden - stabil = 0 - while time.time() < ende: - try: - self.root.update() - sichtbar = self.root.winfo_viewable() and self.app.inhalt.winfo_height() > 50 - except tk.TclError: - return - stabil = stabil + 1 if sichtbar else 0 - if stabil >= 10: # ~0,1 s durchgehend sichtbar - return - time.sleep(0.01) + Start für den Taskleisten-Eintrag kurz aus- und wieder eingeblendet (unter Wine langsamer). + Wird als erster Schritt jedes Ablaufs geprüft – NICHT mit einer eigenen update()-Schleife, + denn ein modaler Dialog (z. B. der Assistent beim Erststart) würde die festhalten.""" + try: + sichtbar = bool(self.root.winfo_viewable()) and self.app.inhalt.winfo_height() > 50 + except tk.TclError: + return True + if not sichtbar: + self._sichtbar_seit = None + return False + if self._sichtbar_seit is None: + self._sichtbar_seit = time.time() + return time.time() - self._sichtbar_seit >= 0.1 # ---------------------------------------------------------------- Zustand def lebt_sonst(self, text: str) -> str: @@ -135,7 +135,7 @@ class Lauf: def ablauf(self, schritte: list[tuple], sekunden: float = 20.0, nachlauf: float = 0.3): """schritte: [(bedingung, aktion, beschreibung), ...] – jede Aktion läuft als eigener Tk-Callback, sobald ihre Bedingung erfüllt ist (auch während ein modaler Dialog offen ist).""" - offen = list(schritte) + offen = [(self.hauptfenster_sichtbar, lambda: None, "Hauptfenster ist sichtbar")] + list(schritte) start = time.time() zustand = {"fertig_seit": None}