跳转至

版本 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 降级

文档

升级建议

pip install -U tkfluent tkdeft

对外 API 是纯加法,旧代码原样能跑。如果你自己写过组件, 建议看一眼有没有这两处:用参数 style 判断主题分支、或者手写"栅格优先 + 回退 SVG"。