Шрифты в Tkinter: настройка, примеры и модуль tkinter.font
Основы работы со шрифтами в Tkinter
Самый простой способ задать шрифт в Tkinter - передать параметр font при создании виджета. Параметр принимает кортеж из трёх элементов: (имя_шрифта, размер, стиль).
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Привет, мир!", font=("Arial", 16, "bold"))
label.pack()
button = tk.Button(root, text="Нажми", font=("Helvetica", 12, "italic"))
button.pack()
root.mainloop()
вывод окна python (создание окна с выводом в python)
В этом примере создаётся метка с жирным шрифтом Arial 16pt и кнопка с курсивом Helvetica 12pt. Стиль может быть "normal", "bold", "italic", "bold italic" или "roman".
Проблема: если имя шрифта содержит пробелы (например, "Times New Roman"), необходимо передавать кортеж из одной строки или использовать модуль tkinter.font.
Типичная ошибка: указание несуществующего шрифта приводит к тому, что Tkinter использует резервный шрифт (обычно TkDefaultFont). Проверить, какой шрифт фактически применяется, можно через метод label.cget("font") или tkinter.font.Font.actual().
Как создать объект шрифта с помощью модуля tkinter.font?
Модуль tkinter.font предоставляет класс Font, который позволяет гибко управлять параметрами:
import tkinter as tk
from tkinter import font
root = tk.Tk()
my_font = font.Font(family="Courier", size=14, weight="bold", slant="italic")
label = tk.Label(root, text="Программирование", font=my_font)
label.pack()
root.mainloop()
открыть окно python (открыть окно на python)
Объект Font можно использовать повторно для нескольких виджетов. Параметры: family (семейство), size (размер в пунктах), weight ("normal" или "bold"), slant ("roman" или "italic"), underline (0/1), overstrike (0/1).
Как использовать встроенные именованные шрифты Tkinter?
Tkinter предопределяет несколько именованных шрифтов: TkDefaultFont, TkTextFont, TkFixedFont, TkMenuFont, TkHeadingFont, TkCaptionFont, TkSmallCaptionFont, TkIconFont, TkTooltipFont. Их можно применять как строку:
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Заголовок", font="TkHeadingFont")
label.pack()
root.mainloop()
Python окно (создание окон в python tkinter)
Это гарантирует, что шрифт будет соответствовать текущей теме оформления (ttk). При изменении темы шрифт обновится автоматически.
Как изменить шрифт на уже существующем виджете?
Метод config() позволяет изменять параметры в любой момент:
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Текст")
label.pack()
def change_font():
label.config(font=("Times", 18, "underline"))
tk.Button(root, text="Сменить шрифт", command=change_font).pack()
root.mainloop()
Аналогично можно менять шрифт для Entry, Button, Text и других виджетов.
Частая ошибка: попытка задать шрифт через строку "Arial 12 bold" - так Tkinter не интерпретирует. Только кортеж или объект Font.
Если размер шрифта не указан, Tkinter использует значение по умолчанию (обычно 10pt). Для кросс-платформенной совместимости стоит указывать размер явно.
На macOS может не быть шрифта Helvetica - используйте "Arial" или получайте список доступных шрифтов через tkinter.font.families().
Расширенные примеры работы со шрифтами
1. Получение списка всех доступных шрифтов
import tkinter as tk
from tkinter import font
root = tk.Tk()
families = font.families()
print("Количество шрифтов:", len(families))
print("Первые 10 шрифтов:", families[:10])
root.destroy()
Количество шрифтов: 143 Первые 10 шрифтов: ['Abyssinica SIL', 'Andale Mono', 'Apple Chancery', 'Arial', 'Arial Black', 'Arial Hebrew', 'Arial Narrow', 'Arial Rounded MT Bold', 'Arial Unicode MS', 'Avenir']
2. Создание шрифта с комбинированными атрибутами
import tkinter as tk
from tkinter import font
root = tk.Tk()
f = font.Font(family="Courier New", size=20, weight="bold", slant="italic",
underline=1, overstrike=1)
label = tk.Label(root, text="Жирный курсив подчёркнутый зачёркнутый", font=f)
label.pack()
# Проверим фактические атрибуты
print("Фактические параметры:", f.actual())
root.mainloop()
Фактические параметры: {'family': 'Courier New', 'size': 20, 'weight': 'bold', 'slant': 'italic', 'underline': 1, 'overstrike': 1}
3. Измерение метрик шрифта (ascent, descent, linespace)
import tkinter as tk
from tkinter import font
root = tk.Tk()
f = font.Font(family="Times", size=24)
print(f"Ascent (верхняя часть): {f.metrics('ascent')}")
print(f"Descent (нижняя часть): {f.metrics('descent')}")
print(f"Linespace (межстрочный интервал): {f.metrics('linespace')}")
print(f"Все метрики: {f.metrics()}")
root.destroy()
Ascent (верхняя часть): 18
Descent (нижняя часть): 6
Linespace (межстрочный интервал): 24
Все метрики: {'ascent': 18, 'descent': 6, 'linespace': 24, 'fixed': 0}
4. Измерение ширины строки с помощью measure()
import tkinter as tk
from tkinter import font
root = tk.Tk()
f = font.Font(family="Arial", size=16)
text = "Длина этой строки в пикселях"
width = f.measure(text)
print(f"Ширина текста '{text}': {width} пикселей")
root.destroy()
Ширина текста 'Длина этой строки в пикселях': 182 пикселей
5. Применение шрифта к элементу Canvas
import tkinter as tk
from tkinter import font
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=200)
canvas.pack()
f = font.Font(family="Verdana", size=18, weight="bold")
canvas.create_text(200, 100, text="Текст на Canvas", font=f, fill="blue")
# Меняем шрифт через config (для уже созданного объекта Canvas)
f.config(size=24, weight="normal")
canvas.create_text(200, 150, text="Изменённый шрифт", font=f, fill="red")
root.mainloop()
Результат: на холсте отображаются два текста с разными настройками шрифта.
6. Создание подкласса Font для кастомизации
import tkinter as tk
from tkinter import font
class CustomFont(font.Font):
def __init__(self, family="Arial", size=12, **kwargs):
super().__init__(family=family, size=size, **kwargs)
def make_bold_italic(self):
self.config(weight="bold", slant="italic")
root = tk.Tk()
f = CustomFont("Courier", 14)
f.make_bold_italic()
label = tk.Label(root, text="Кастомный шрифт", font=f)
label.pack()
root.mainloop()
7. Использование шрифта с тегами в текстовом виджете
import tkinter as tk
from tkinter import font
root = tk.Tk()
text_widget = tk.Text(root, height=5, width=40)
text_widget.pack()
# Создаём разные шрифты для тегов
font_tag1 = font.Font(family="Georgia", size=14, weight="bold")
font_tag2 = font.Font(family="Comic Sans MS", size=16, slant="italic")
text_widget.tag_configure("tag1", font=font_tag1)
text_widget.tag_configure("tag2", font=font_tag2)
text_widget.insert(tk.END, "Это жирный Georgia\n", "tag1")
text_widget.insert(tk.END, "Это курсив Comic Sans", "tag2")
root.mainloop()
Результат: две строки в одном текстовом виджете с разными шрифтами.