fix: defer grab_set() to avoid 'window not viewable' error

CTkToplevel grab_set() fails when called before the window is
fully realized on screen. Defer to after(50ms) so the window
has time to become viewable.
This commit is contained in:
Jeremy Shen
2026-06-10 14:53:22 +08:00
parent d5fd816ff9
commit 7afc9051ab
3 changed files with 11 additions and 2 deletions
+10 -1
View File
@@ -797,9 +797,11 @@ class UartMonitorWindow(ctk.CTkToplevel):
self.title("UART Monitor")
self.geometry("680x540")
self.minsize(480, 360)
self.grab_set()
self.protocol("WM_DELETE_WINDOW", self._on_close)
# Defer grab_set until window is viewable (avoids "window not viewable" error)
self.after(50, self._do_grab)
self._port = port
self._baudrate = baudrate
self._monitor: UartMonitor | None = None
@@ -814,6 +816,13 @@ class UartMonitorWindow(ctk.CTkToplevel):
# Try to open serial port after window is drawn
self.after(100, self._try_open)
def _do_grab(self) -> None:
"""Acquire grab once window is viewable."""
try:
self.grab_set()
except Exception:
pass # Window may have been destroyed already
# ── Title Bar ──────────────────────────────────────────────
def _build_title_bar(self) -> None: