使用 ttk 样式创建派生的下划线文本样式

Create Derived Underline Text Style Using ttk Styling

总结

如何使用 ttk 样式创建带下划线文本的派生样式?

详情

我正在尝试创建从内置 TLabel 样式派生的 ttk 样式。内置样式和派生样式之间的唯一区别应该是文本带有下划线;它应该继承内置 TLabel 样式的所有其他特征(即,如果 TLabel 字体稍后更改,Underline.TLabel 也应更改)。

我知道基本方法(不使用 ttk 样式)是创建新的带下划线的字体。但是,正如您从示例代码(下面)中看到的那样,Underline.TLabel 样式以正确的(默认)字体显示,但字体大小更大。我确定我遗漏了一些明显的东西,但无法通过任何 Google 搜索等找到它

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

def main():
    root = tk.Tk()
    style = ttk.Style(root)
    f = font.Font(underline=1)
    style.configure('Underline.TLabel', font=f)
    lbl0 = ttk.Label(root, text='Label 0', style='TLabel')
    lbl0.pack()
    lbl1 = ttk.Label(root, text='Label 1', style='Underline.TLabel')
    lbl1.pack()
    root.mainloop()


if __name__ == '__main__':
    main()

问题是您假设 font.Font(underline=1) returns 与 TLabel 使用的字体完全相同,但打开了下划线位。这可能正确也可能不正确,具体取决于平台及其配置方式。

如果您需要自定义字体基于 TLabel 使用的字体,您应该首先复制字体而不是依赖默认字体。

例如:

original_font = font.nametofont(style.lookup("TLabel", "font"))
f = font.Font(**original_font.configure())
f.configure(underline=1)