返回开发日志
飞书多维表同步工具2026-07-09v4.0.7

弹窗打开时左上角闪烁再移动到中间

bug修复v4.0.7

需求描述

用户反馈所有弹窗在点击打开时都会在屏幕左上角闪烁一下,然后再移动到屏幕中间,影响体验。

根因分析

tk.Toplevel 创建时窗口立即在默认位置(0,0)左上角显示,随后 update_idletasks() 触发渲染让窗口在左上角可见,最后 geometry() 才将窗口移动到屏幕中间——用户就看到"左上角闪烁一下再移动"的现象。

修复方案

创建 Toplevel 后立即 withdraw() 隐藏窗口,设置好 geometry 位置后再 deiconify() 显示。这样窗口在显示前就已经设置好正确位置,不会出现闪烁。

改动文件清单

文件改动内容
gui_sync.pyActivationDialog、PairingDialog、DeleteSelectDialog、splash root 共4处弹窗加 withdraw/deiconify
tabs/sync_tasks_tab.py_show_task_dialog 编辑同步任务弹窗加 withdraw/deiconify
tabs/erp_report_tab.py_show_export_name_manager 管理弹窗、_show_task_dialog 编辑任务弹窗共2处加 withdraw/deiconify
gui_sync.py版本号 4.0.6 → 4.0.7

技术要点

  • withdraw():隐藏窗口使其不可见,但窗口控件仍可正常布局和计算尺寸
  • deiconify():恢复窗口显示,此时 geometry 已设置好正确位置,直接在目标位置显示
  • 修改模式Toplevel创建 → withdraw() → 设置内容 → update_idletasks() → geometry(居中) → deiconify()
  • 共修复7处弹窗(14个 withdraw/deiconify 调用点)

踩坑与解决

  • 并行 Edit 冲突:首次修改时3处(ActivationDialog、PairingDialog withdraw、DeleteSelectDialog _center_window deiconify)因并行 Edit 被覆盖丢失,改为逐个修改后全部成功。教训:对同一文件的多个 Edit 不要并行执行,应串行处理。

验证结果

  • 语法检查:3个文件全部通过 py_compile
  • 代码审查:14处 v4.0.7 标记(7对 withdraw+deiconify)全部验证存在