版本 0.3.0:跟着底层接口走一遍
这一版没有新组件,做的是三件事:把组件里重复的绘制样板交还给底层库、 修掉两个被回归漏掉的缺陷、把文档补成一本能读的书。
修改
绘制样板收敛回 tkdeft(净删约 400 行)
以前每个组件都要自己写一遍"先试栅格引擎、失败再回退 SVG":
# 旧写法:每个组件抄一遍
item = self.create_roundrect_raster(x1, y1, x2, y2, radius, fill=fill, ...)
if item is not None:
return item
self._img = self.svgdraw.create_roundrect(...)
self._tkimg = self.svgdraw.create_svg_image(self._img, temppath2, way=get_renderer())
return self._keep_photo(self.create_image(x1, y1, anchor="nw", image=self._tkimg), self._tkimg)
现在统一交给 tkdeft 的 draw_roundrect() 一族:
# 新写法:一行,判定与回退都在底层
return self.draw_roundrect(x1, y1, x2, y2, radius, fill=fill, ...)
button / badge / togglebutton / entry / text / listbox / frame / scrollbar / slider 九个模块都换了过来,其中 button 与 frame 的整段覆盖代码被直接删掉。
修复:点"切换主题"直接崩
FluListBox.theme() 用参数 style 判断分支,而一键换肤只传 mode,
于是 None.lower() 抛 AttributeError。已改为读构造时存下的 self.style 并兜底。
其余组件本来就是 self.style,只有这里写错。
修复:自检把真异常吞掉了
python -m tkflu --check 为了跳过"没有这个钩子的组件",写的是
except AttributeError: continue——结果把钩子内部抛出的 AttributeError
也一起吞了,所以上面那个崩溃在 9 项回归全绿的情况下一直没被发现。
现在改成先 getattr 判断钩子是否存在再调用,并且额外跑一遍真实路径:
thememanager.mode("dark") / mode("light")。把 FluListBox.theme 换回旧写法,
自检会立刻以退出码 1 报错。
其它
FluSlider.pos()加了event is None守卫(_event_on_button1(event=None)允许省略事件,但pos会直接读event.x)- 新增
tkflu.__version__与tkflu.MIN_TKDEFT_VERSION - 依赖由
tkdeft = "0.2.0"放宽为>=0.2.0,避免底层升小版本时被 pip 降级
文档
- 新增 它是怎么搭起来的(分层、组件内部结构、事件与主题走向)
- 新增 常见问题与排查(14 条真实踩过的坑,按症状查)
- 组件总览 补上组件图鉴与按钮状态矩阵
- 渲染引擎与性能 补上引擎查询接口与"组件怎么落到引擎上"
- 所有插图由
docs/gen_figures.py用真实运行的组件截图生成,可重新跑
升级建议
pip install -U tkfluent tkdeft
对外 API 是纯加法,旧代码原样能跑。如果你自己写过组件,
建议看一眼有没有这两处:用参数 style 判断主题分支、或者手写"栅格优先 + 回退 SVG"。