Шрифты в 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().

- Python tkinter messagebox (messagebox в tkinter)
- Tkinter python ввод (ввод данных в tkinter)
- Python tkinter виджет (виджеты tkinter)

Расширенные примеры работы со шрифтами

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()

Результат: две строки в одном текстовом виджете с разными шрифтами.

Шрифты в tkinter - comments

En
Tkinter python шрифт (python)