Skip to content

Releases: bvb6417/tkwebui

TkWebUI 0.3.1

Choose a tag to compare

@bvb6417 bvb6417 released this 21 Oct 14:41

修复自定义标题栏销毁内置 controls 后,移动窗口反复出现 TclError 的回归问题(#5)。

  • 按钮状态同步和绘制跳过已销毁的控件。
  • 几何缓存、拖动区域、交互排除区域及按轴 resizable 策略继续正常更新。
  • 新增 Windows GUI 回归脚本,覆盖默认控件、销毁整个容器、单独销毁最大化按钮、自定义绘制及挂载前销毁 5 种场景。

已在 Windows + Python 3.11 验证移动窗口、四种 resizable 组合、最小化还原,以及示例启动和截图。用新的 tkwebui 文件夹替换旧版即可,接口不变。

TkWebUI 0.3.0

Choose a tag to compare

@bvb6417 bvb6417 released this 21 Oct 11:15

性能(#4)

Windows 11、150% 缩放,demo 全部 12 个页面,3 次取中位数:

0.2.0 0.3.0
apply_theme 0.55 s 0.23 s
demo 启动到窗口就绪 1.05 s 0.72 s
页面首次打开(平均) 286 ms 209 ms
  • 圆角 / 圆形位图直接生成带透明通道的 PNG,不再拼接颜色字符串、逐像素 transparency_set;圆角贴片的四个角各一次批量写入;颜色解析带缓存。
  • 字体检查直接解析目标字体,不再调用 tkfont.families() 枚举全部系统字体。
  • 线条图标快约 5 倍:每条笔画只计算附近的采样点,同一图标换颜色时复用。
  • 以上改动生成的位图与 0.2.0 逐像素一致。

同一窗口下套用主题与不套用主题相比,主题本身的开销为:启动 +0.22 s,页面首次打开平均 +16 ms,再次打开平均 +6 ms。

修复

  • 窗口显示后再构建的页面不再先窄后宽:新增 ScrollArea.prepare(width, height),先在可视区域外按最终尺寸完成布局,再显示;demo 的页面切换已改用这种方式。demo 首次显示时也不再能看到页面逐步变宽。
  • 关闭菜单、浮层、日历、对话框或通知后,同一窗口上其他组件绑定的 <Configure> 等处理器不再一起丢失(Python 3.13 以前 unbind 的问题)。
  • Strong.TLabel、Muted.TLabel 等样式字体不再被选项数据库的 *Font 覆盖,加粗标题、小字说明现在按设计显示。
  • 菜单定位不再修改全局 ctypes.windll.user32 的函数原型,避免影响宿主程序自己的 ctypes 调用。
  • MenuButton / OptionMenu / 下拉按钮的箭头不再被纵向平铺成多个。
  • 切换按钮、工具按钮与其他按钮同高(150% 缩放下 49 px,此前 63 px)。
  • 多列表格(configure_table)除最后一列外保持设定的列宽,多出的宽度只分给最后一列。

新增

page = ui.ScrollArea(deck)
build(page.body)
page.prepare(deck.winfo_width(), deck.winfo_height())   # 屏幕外完成布局
current.pack_forget()
page.pack(fill='both', expand=True)

说明见 docs/guide.md。

升级

用新的 tkwebui 文件夹替换旧的即可,已有接口不变。由于样式字体问题已修复,加粗标题和小字说明会和 0.2.0 看起来不同。

TkWebUI 0.2.0

Choose a tag to compare

@bvb6417 bvb6417 released this 18 Oct 10:18

修复

  • WindowChrome 与 resizable(False) 冲突(#2):固定尺寸窗口现在按请求尺寸打开(此前请求 640×420,实际约 662×476),拖动不再越拖越宽,最小化后还原不再残缺。固定窗口不能再最大化;最大化按钮、双击标题栏和边缘缩放都按 resizable() 分别对宽、高生效。
  • 可调整尺寸的窗口同样按请求尺寸打开,运行中 geometry('宽x高') 的尺寸也是精确的。
  • 运行中修改 resizable() 后,自绘标题栏和窗口尺寸保持正确(Tk 会重建原生窗口,现在会自动重新接管)。

新增

  • PlaceholderEntry / set_placeholder(#3):输入框为空时显示灰色提示,开始输入后消失。
ui.PlaceholderEntry(parent, placeholder='请输入用户名')
ui.set_placeholder(existing_entry, '搜索')        # 已有的 Entry / Combobox / Spinbox / tk.Entry
ui.set_placeholder(readonly_combo, '请选择…')     # 只读下拉框未选择时

提示是覆盖在输入框上的标签,不是框里的文字:get() 和 textvariable 始终是真实内容,密码框、输入校验和只读状态不受影响;获得焦点后提示仍显示,直到开始输入。

文档

  • 多列列表的对齐方式(表项与表头分别设置)。
  • 按需滚动条的行为说明。

升级

用新的 tkwebui 文件夹替换旧的即可,已有接口不变。