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

窗口位置持久化全面修复+软件介绍文档

bug修复+新功能v4.0.17

需求描述

  1. 窗口位置持久化未完全实现:拖动窗口到不同位置并关闭后,重新打开大部分时候固定出现在中间略下位置,底部被任务栏遮挡
  2. 需要一份含软件界面图片的软件介绍文档,用于放到个人网站作为项目展示

根因分析(窗口位置问题)

v4.0.16的窗口位置管理存在三个问题:

  1. 任务栏高度假设不准确:硬编码 taskbar_h=48,但实际任务栏高度可能为40~56px不等(取决于用户设置),导致垂直居中计算偏差
  2. _recalibrate过度干预:启动后50ms的校准逻辑会在窗口底部超出 sh_full - taskbar_h 时强制上移,但用了不准确的48px,导致窗口被移到错误位置
  3. 保存时未检查窗口状态_on_closing 直接调用 self.master.geometry() 保存,但若窗口处于最小化(iconic)状态,geometry返回的位置不正确;最大化(zoomed)状态下尺寸不反映用户偏好

改动文件清单

文件改动内容
gui_sync.py新增 _get_work_area() 函数(Win32 API SystemParametersInfoW(SPI_GETWORKAREA) 获取真实工作区矩形,自动排除任务栏);__init__ 中用工作区替代假设的48px计算默认居中位置;恢复保存位置时验证至少50%在工作区内,否则回退默认居中;_recalibrate 简化为仅在窗口完全在工作区外时才纠正;_on_closing 保存前检查窗口状态(zoomed先恢复正常再保存,iconic不保存);版本号 4.0.16→4.0.17
docs/软件介绍.html新增:软件介绍展示页面(HTML格式,含5张界面截图、6大概述卡片、5大功能模块详解、10项技术栈、6项安全机制),用于个人网站展示
assets/screenshot_*.png新增5张软件界面截图:凭据管理、数据同步任务、ERP报表导出、任务编排、执行日志(通过自动化截图脚本捕获)

技术要点

  1. Win32 API获取真实工作区SystemParametersInfoW(0x0030, 0, &rect, 0) 返回的工作区矩形已自动排除任务栏(无论任务栏在底部/顶部/侧边),比假设48px准确得多。1920×1080下任务栏在底部时返回 (0, 0, 1920, 1040),工作区高度1040px
  2. 保存位置验证机制:恢复保存的geometry后,计算窗口与工作区的交集面积,若可见部分不足50%则判定为无效位置(可能来自多显示器切换或分辨率变更),回退到默认居中。这解决了"拖到不同位置但恢复错误"的问题
  3. _recalibrate最小干预原则:v4.0.16的校准逻辑在窗口底部超出时强制上移,会覆盖用户拖动的位置。v4.0.17改为仅在窗口完全在工作区外(cur_x + real_w < wa_left + 20cur_x > wa_right - 20)时才拉回居中,正常位置一律不动
  4. 保存前状态检查_on_closing 检查 self.master.state()——zoomed状态先 state('normal') + update_idletasks() 恢复正常再获取geometry;iconic状态跳过保存,保留上次normal状态的保存位置
  5. 自动化截图方案:编写 scripts/auto_screenshot.py 脚本,启动软件→Win32 API查找窗口句柄→keybd_event 模拟Ctrl+Tab切换Tab→PIL.ImageGrab 截图→保存到assets目录→关闭软件。5张截图全自动捕获,脚本用完即删

验证结果

  • 语法检查:gui_sync.py 通过 py_compile
  • 截图验证:5张截图全部成功生成(每张约248KB),覆盖5个Tab界面
  • HTML文档验证:466行完整写入,以 </html> 结尾,引用5张截图相对路径
  • 居中计算验证(1920×1080,任务栏底部40px):工作区=(0,0,1920,1040),default_x=(1920-900)/2=510,default_y=(1040-800)/2=120

踩坑与解决

  • _on_closingmaster 变量名错误:首次修改时在 _on_closing 方法内写了 master.update_idletasks(),但该方法作用域中没有 master 局部变量,应为 self.master。立即修复
  • Ctrl+Tab截图顺序:Tkinter Notebook的Ctrl+Tab默认按Tab添加顺序切换,与界面显示顺序一致。截图脚本按此顺序截取5个Tab,截图文件名与Tab名称一一对应

下一阶段规划

  • 观察v4.0.17在不同分辨率/多显示器/DPI缩放下的窗口位置恢复效果
  • 软件介绍HTML页面可进一步美化(添加动画效果、深色模式切换等)