Несколько вариантов шрифтов TKInter

#python-3.x #tkinter #fonts #ttk

Вопрос:

Я пытаюсь лучше понять использование шрифтов в tkinter и ttk .

Мой план состоит в том, чтобы иметь два разных стиля для заголовков, каждый со своим собственным размером шрифта. Я использовал nametofont() для создания экземпляра шрифта, а затем установил размер в двух разных стилях:

 labelFont = tkinter.font.nametofont('TkTextFont')
labelFont.config(weight='bold')

ttk.Style().configure("TLabel", font=labelFont, size=12)
ttk.Style().configure("heading.TLabel", font=labelFont, size=48)
 

затем примените стили к заголовкам:

 heading = ttk.Label(root, text="Heading", style="heading.TLabel")
label = ttk.Label(root, text="Label", style="TLabel")   #   is style redundant?
 

К сожалению, я не получаю два разных размера, так что это явно неправильный подход.

Я также попробовал что-то вроде этого:

 labelFont = tkinter.font.nametofont('TkTextFont')
headingFont = tkinter.font.nametofont('TkTextFont')
# etc
 

думая, что я получу два независимых экземпляра шрифта, но они кажутся одним и тем же экземпляром. Если бы они были независимыми, я мог бы configure() дать каждому из них свой собственный размер шрифта.

Я выбрал этот подход, потому что хотел использовать встроенный именованный шрифт и использовать переменные для поддержания согласованности. Каков правильный подход к этому?

Ответ №1:

Вам нужно использовать .config(size=...) на разных экземплярах Font :

 labelFont = tkinter.font.nametofont('TkTextFont')
labelFont.config(weight='bold', size=12)

# create a clone of labelFont using Font.copy()
headingFont = labelFont.copy()
headingFont.config(size=48)

s = ttk.Style()
s.configure('TLabel', font=labelFont) # apply to all instance of ttk.Label
s.configure('heading.TLabel', font=headingFont, size=96)

heading = ttk.Label(root, text='Heading', style='heading.TLabel')
label = ttk.Label(root, text='Label') # style='TLabel' is not necessary
 

Комментарии:

1. То, что исправило это для меня, — это выражение labelFont.copy() лица . Я должен был уже знать, что мне следовало бы сделать клон объекта шрифта. Если вы будете рады добавить это к своему ответу, я могу его принять. Спасибо