获取样式字体 (Ttk)

Get style font (Ttk)

我正在尝试从我设置的样式中获取字体名称和下划线设置。

问题是,当我使用:

style.lookup("My.TLabel", "font"),

它return是字符串

font1

为什么 style.lookup() return 没有输入实际的字体名称和下划线信息?

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) # <--Here, it gives me 'font1' instead of tkDefaultFont

root.mainloop()

注意:如果我将字体指定为字符串,style.lookup() 将按预期工作:

style.configure("My.TLabel", font="TkDefaultFont 25 underline")
style.lookup("My.TLabel", "font")
>> TkDefaultFont 25 underline

但如果我这样做,它不会 return 使用 style.lookup() 的字体名称:

custom_font = tkFont.Font(family="TkDefaultFont",
                          size=25,
                          underline=True)
style.configure("My.TLabel", font=custom_font)
style.lookup("My.TLabel", "font")
>> font1

但我想将字体对象而不是字符串传递给 style.configure()。 关于如何让 style.lookup() 到 return 字体名称和下划线设置的任何想法?

原来一个字体对象有一个name字段(字符串)。

我们可以将字体对象的名称与 style.lookup() 将 return 的名称进行比较。如果它们匹配,那么我们就知道我们有我们感兴趣的字体。然后我们可以使用 cget()方法。

这是一个例子:

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)

label_font = style.lookup("My.TLabel", "font")

if label_font == custom_font.name:
    # Get the font info
    font_name = custom_font.cget("family")
    size = custom_font.cget("size")
    is_underlined = custom_font.cget("underline")

    print(f"{font_name=}, {size=}, {is_underlined=}")


root.mainloop()

底层 tcl/tk 引擎不了解 python 对象,因此它所能做的就是 return 字符串(和字符串列表)。

字体模块附带了一种将字体名称转换为字体对象的方法。以下示例说明了如何:

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

style = ttk.Style()
font_name = style.lookup("My.TLabel", "font")
font = tkinter.font.nametofont(font_name)
print(f"family: {font.cget('family')} size: {font.cget('size')}")