You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ttk传入Font对象配置样式时style.lookup()无法返回实际字体属性

ttk样式lookup查询Font对象配置返回内部名的问题

问题表现

从已配置的ttk样式中获取字体名称、下划线等配置时,调用style.lookup("My.TLabel", "font")预期返回完整字体属性,实际返回值为:

font1
只有直接以字符串形式给样式指定字体时,style.lookup()才会返回符合预期的字体描述字符串;传入tkinter.font.Font实例时,仅能拿到Tk内部生成的字体资源标识,无法直接读取字体属性。

复现代码

import tkinter as tk
import tkinter.font as tkFont
from tkinter import ttk


root = tk.Tk()

custom_font = tkFont.Font(family="TkDefaultFont",
                          size=25,
                          underline=True)

style = ttk.Style()
style.configure("My.TLabel", font=custom_font)

info = style.lookup("My.TLabel", "font")
print(info) # 此处输出'font1',而非预期的字体属性

root.mainloop()

两种传参的返回差异

  • 传入字符串字体配置:返回正常
style.configure("My.TLabel", font="TkDefaultFont 25 underline")
style.lookup("My.TLabel", "font")
# 返回值: TkDefaultFont 25 underline
  • 传入Font字体对象:返回内部标识
custom_font = tkFont.Font(family="TkDefaultFont",
                          size=25,
                          underline=True)
style.configure("My.TLabel", font=custom_font)
style.lookup("My.TLabel", "font")
# 返回值: font1

原因

style.lookup()返回的是样式表中存储的原始配置值。当传入Font对象时,ttk不会将对象拆解为可读的字体描述字符串存储,只会保存Tk底层为该Font对象分配的内部资源名,因此直接调用lookup只能拿到这个无业务意义的内部标识。

解决方案

不需要修改原有传入Font对象的配置逻辑,只需要在查询时多一步转换:

  1. 用style.lookup()拿到内部字体名
  2. 调用tkinter.font.nametofont()将内部名转换为对应的Font实例
  3. 通过Font实例的cget()方法读取family、size、underline等所有需要的属性

实现示例

import tkinter as tk
import tkinter.font as tkFont
from tkinter import ttk

root = tk.Tk()

custom_font = tkFont.Font(family="TkDefaultFont",
                          size=25,
                          underline=True)

style = ttk.Style()
style.configure("My.TLabel", font=custom_font)

# 查询转换
font_internal_name = style.lookup("My.TLabel", "font")
target_font = tkFont.nametofont(font_internal_name)

# 读取具体属性
font_family = target_font.cget("family")
font_size = target_font.cget("size")
is_underline = target_font.cget("underline")

# 可拼接为和字符串传参一致的返回格式
font_desc = f"{font_family} {font_size} {'underline' if is_underline else ''}"
print(font_desc) # 输出: TkDefaultFont 25 underline

root.mainloop()

如果需要让style.lookup()直接返回可读的字体字符串,也可以在配置样式时主动传入Font对象的属性拼接结果,不过上述转换方法不需要改动原有配置逻辑,适配性更好。


内容的提问来源于stack exchange,提问作者garlic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:48:36