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
+1 -1
View File
@@ -1,7 +1,7 @@
bootloader_bin_path: /home/ly0kos/work/Verify/FW/tftp_app/bootloader/bootloader_z100_800M.bin bootloader_bin_path: /home/ly0kos/work/Verify/FW/tftp_app/bootloader/bootloader_z100_800M.bin
bootloader_bit_path: /home/ly0kos/work/Verify/FW/tftp_app/bootloader/pl_arm_wrapper_hw_platform_0/pl_arm_wrapper.bit bootloader_bit_path: /home/ly0kos/work/Verify/FW/tftp_app/bootloader/pl_arm_wrapper_hw_platform_0/pl_arm_wrapper.bit
bootloader_elf_path: /home/ly0kos/work/Verify/FW/tftp_app/bootloader/app.elf bootloader_elf_path: /home/ly0kos/work/Verify/FW/tftp_app/bootloader/app.elf
erase_all: true erase_all: false
firmware_bin_path: /home/ly0kos/work/Verify/FW/V1.3.1.3.3_06_01_pmu_cpld_check/V1.3.1.3.3_06_01_pmu_cpld_check.bin firmware_bin_path: /home/ly0kos/work/Verify/FW/V1.3.1.3.3_06_01_pmu_cpld_check/V1.3.1.3.3_06_01_pmu_cpld_check.bin
flash_model: s25fl256s1 flash_model: s25fl256s1
flash_type: qspi-x4-single flash_type: qspi-x4-single
+10 -1
View File
@@ -797,9 +797,11 @@ class UartMonitorWindow(ctk.CTkToplevel):
self.title("UART Monitor") self.title("UART Monitor")
self.geometry("680x540") self.geometry("680x540")
self.minsize(480, 360) self.minsize(480, 360)
self.grab_set()
self.protocol("WM_DELETE_WINDOW", self._on_close) 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._port = port
self._baudrate = baudrate self._baudrate = baudrate
self._monitor: UartMonitor | None = None self._monitor: UartMonitor | None = None
@@ -814,6 +816,13 @@ class UartMonitorWindow(ctk.CTkToplevel):
# Try to open serial port after window is drawn # Try to open serial port after window is drawn
self.after(100, self._try_open) 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 ────────────────────────────────────────────── # ── Title Bar ──────────────────────────────────────────────
def _build_title_bar(self) -> None: def _build_title_bar(self) -> None:
Binary file not shown.