tkflu
Fluent设计的tkinter组件库(模板)
作者:XiangQinxi
贡献者:totowang-hhh
FluGradient
源代码位于: tkflu\designs\gradient.py
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | |
generate_hex2hex(start_hex, end_hex, steps)
专为HEX颜色设计的渐变生成器 :param start_hex: 起始颜色 HEX格式 (如 "#FF0000") :param end_hex: 结束颜色 HEX格式 (如 "#0000FF") :param steps: 渐变步数 :return: HEX格式的颜色列表
源代码位于: tkflu\designs\gradient.py
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | |
generate_rgb2hex(start_color, end_color, steps)
生成颜色渐变序列
源代码位于: tkflu\designs\gradient.py
14 15 16 17 18 19 20 21 22 23 24 | |
FluRenderer
Bases: object
面向对象风格的渲染器开关(保留旧 API)。
::
renderer = FluRenderer()
renderer.renderer("skia") # 设置
renderer.renderer() # 读取,-> 2
源代码位于: tkflu\designs\renderer.py
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 | |
renderer(way=None)
读写当前渲染器。
:param way: None 表示只读;否则等价于 :func:set_renderer
:returns: 读取时返回编号,设置时返回 None
源代码位于: tkflu\designs\renderer.py
256 257 258 259 260 261 262 263 264 265 | |
SegoeFluentIcons(size=9, weight='normal', *args, **kwargs)
加载一份 Segoe Fluent Icons 字体对象。
:param kwargs: 可含 master(多解释器场景必须传,理由同 :func:SegoeFont)
源代码位于: tkflu\designs\fonts\__init__.py
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | |
SegoeFont(size=9, weight='normal', master=None)
加载一份 Segoe UI 字体对象。
:param size: 字号
:param weight: 字重("normal" / "bold")
:param master: 目标 Tk 控件;多解释器场景必须传。
.. warning::
不传 master 时,tkextrafont / tkinter.font 都会把字体注册到
tkinter._default_root 所属的那个解释器上。同一个进程里开了第二个
FluWindow 时,第二个解释器并不认识这个名字,Tk 会静默退回
系统兜底字体(实测变成"宋体 18"),文字又大又难看。
组件层统一通过 :func:tkflu.defs.set_default_font 传入自己的 master。
源代码位于: tkflu\designs\fonts\__init__.py
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | |
call_command(callback, *args)
按回调实际能接受的参数个数调用它。
组件回调的签名历来不统一:FluButton 的 command 不接受参数,
而列表 / 导航类组件的回调天然想知道"选中了哪一项"。如果直接
callback(index, item),所有只写 lambda: ... 的老代码都会
TypeError;反过来直接 callback(),想拿到选中项的人又拿不到。
这里检查一次签名,取两者都能接受的最大参数个数——既不让老写法崩,
也不强迫新写法用 *args。
:param callback: 可调用对象;为 None 时直接返回 None
:param args: 候选参数(按位置顺序)
:returns: 回调的返回值
::
call_command(lambda: print("hi")) # -> hi(忽略多出来的参数)
call_command(lambda i: print(i), 3) # -> 3
call_command(lambda *a: print(a), 1, 2) # -> (1, 2)
.. note:: 签名无法获取时(部分 C 实现的内建可调用对象)退化为"不传参数"。
源代码位于: tkflu\defs.py
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | |
dark()
深色主题图标的文件路径(历史 API,见模块文档)。
源代码位于: tkflu\icons.py
98 99 100 | |
easing_function(name)
按名字取缓动函数;名字不认识时退回默认曲线而不是抛异常。
理由和 :meth:tkflu.button.FluButton.theme 里那个"未知 style 退回默认值"
的约定一致:一次换肤不该因为一个拼错的曲线名整趟崩掉。
:param name: 曲线名,或一个可调用对象(原样返回)
源代码位于: tkflu\designs\animation.py
98 99 100 101 102 103 104 105 106 107 108 109 110 | |
easing_names()
所有可用的缓动名字(排序后)。
源代码位于: tkflu\designs\animation.py
93 94 95 | |
get_renderer()
当前渲染器编号(保持历史 API)。
:returns: 0–4;组件里判"是不是 Wand"用 get_renderer() == 1
源代码位于: tkflu\designs\renderer.py
207 208 209 210 211 212 | |
get_renderer_name()
当前引擎名,比编号更直观。
源代码位于: tkflu\designs\renderer.py
215 216 217 | |
get_theme_easing()
当前主题过渡的缓动曲线名。
源代码位于: tkflu\designs\animation.py
118 119 120 | |
icon()
默认应用图标的文件路径(历史 API,见模块文档)。
源代码位于: tkflu\icons.py
88 89 90 | |
icon_data(name='light')
返回图标的 base64 数据(不落盘)。
源代码位于: tkflu\icons.py
68 69 70 | |
icon_photoimage(name='light', master=None)
直接用内嵌 base64 建 PhotoImage,完全不落盘。
:param name: "light" / "dark" / "icon"
:param master: 目标控件;多解释器场景必须传,否则图片会挂到默认根窗口
.. warning:: 这里刻意不做进程级缓存。
早先按 (id(tk), name) 缓存过一份 PhotoImage,看起来省了一次
解码,代价却很大:
PhotoImage与它的 Tk 解释器同生共死,缓存里留一张就等于 让整个解释器无法回收——实测反复开关窗口 50 次,内存涨了 ~96 MB(清掉缓存后只涨 ~12 MB);id()会被复用。解释器销毁后 id 可能被下一个解释器占用, 于是拿到的是一张属于已死解释器的图片,报 "not a photo image"。
解码内嵌的 base64 很便宜,而调用方(FluWindow / FluToplevel)
本来就用 self._icon_photo 持着引用,不需要这里再存一份。
源代码位于: tkflu\icons.py
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | |
is_wide_char(char)
判断是否为"宽字符"(中日韩文字、全角标点、emoji 等)。
这类字符的显示宽度约为拉丁字母的两倍。用 len() 估算文本宽度时
必须把它们按 2 个字符计,否则中文标签会被算得严重偏窄。
源代码位于: tkflu\defs.py
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
label_cells(label)
把标签折算成"拉丁字符个数":宽字符算 2 个。
源代码位于: tkflu\defs.py
37 38 39 | |
light()
浅色主题图标的文件路径(历史 API,见模块文档)。
源代码位于: tkflu\icons.py
93 94 95 | |
list_renderers()
列出 (编号, 引擎名, 是否可用)。
::
>>> list_renderers()
[(0, 'tksvg', True), (1, 'wand', True), (2, 'skia', True), ...]
源代码位于: tkflu\designs\renderer.py
220 221 222 223 224 225 226 227 228 229 230 231 232 | |
measure_label_width(master, label, padding=26)
估算一个菜单/按钮标签需要多宽(像素)。
历史实现用 len(label) * 8:对 "FluMenu1" 这类拉丁标签大致够用,
但对中日韩文字会严重偏窄——"文件" 只有 2 个字符,算出来 16 像素,
文字被挤成一团。
这里优先向 Tk 要真实度量;拿不到字体时退回"宽字符按 2 个计"的估算。
:param master: 任意控件(用于定位 Tk 解释器与字体) :param label: 标签文本 :param padding: 在文本宽度之外额外预留的左右内边距
源代码位于: tkflu\defs.py
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | |
renderer_description(name)
取某个引擎的一句话说明(用于 --list-engines 之类的输出)。
:param name: 引擎名;未知名字时返回空字符串
源代码位于: tkflu\designs\renderer.py
235 236 237 238 239 240 241 242 243 | |
set_default_font(font, attributes, master=None)
把字体写进 attributes.font,调用方传了就用调用方的。
:param font: 调用方指定的字体;None 表示用库默认的 Segoe UI
:param attributes: 组件的属性字典(通常是 self.attributes)
:param master: 组件自己(强烈建议传)。字体对象是按 Tk 解释器
注册的:不传 master 时它会挂到 tkinter._default_root 上,
同一进程里第二个 FluWindow 所属的解释器就不认识这个字体名,
Tk 会静默退回系统兜底字体(实测"宋体 18"),界面直接走样。
.. note::
旧实现只在 font is None 时才写 attributes.font,
于是 FluLabel(root, font=("Courier New", 24)) 里的 font
被整个丢掉,attributes.font 保持 None,最终画出来的是
TkDefaultFont——比库默认字体还不对。
源代码位于: tkflu\defs.py
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | |
set_renderer(way)
切换渲染引擎。
:param way: 整数编号(0–4)或引擎名("skia" / "pillow" /
"cairo" / "tksvg" / "wand")
引擎不可用时抛 ValueError,避免"以为开了 skia 其实还在走慢路径"。
选择会同步给 tkdeft 的引擎注册表,并记在环境变量里以便子进程继承。
源代码位于: tkflu\designs\renderer.py
194 195 196 197 198 199 200 201 202 203 204 | |
set_theme_easing(name)
设置主题过渡的缓动曲线,取值见 :data:EASINGS。
源代码位于: tkflu\designs\animation.py
113 114 115 | |
suspended_widget_animation()
在这个上下文里,各组件自己的 _theme() 动画全部让路。
:func:~tkflu.theme_transition.run_theme_transition 用它来"静默地"把
目标配色写进各组件,从而拿到干净的插值起点。
.. note:: 用计数而不是布尔量:统一过渡本身也可能被嵌套调用(窗口 → 面板 → 菜单栏), 布尔量会在内层退出时把外层的暂停提前解除。
源代码位于: tkflu\designs\animation.py
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | |
widget_animation_suspended()
当前是否处于"让路"状态。
源代码位于: tkflu\designs\animation.py
149 150 151 | |