Как рисовать текст различными шрифтами

На этом занятии мы с вами разберемся как в Pygame происходит отображение текста разными шрифтами. И начнем со шрифтов. Для работы с ними имеется встроенный модуль:

pygame.font

в котором определены следующие полезные классы и функции:

  • SysFont(fontname, size) – класс для выбора предустановленного шрифта (по имени fontname) с размером size (в пикселях);
  • Font(path, size) – класс для загрузки шрифта по указанному пути path с размером size (в пикселях);
  • get_fonts() – функция, возвращающая имена предустановленных в системе шрифтов;
  • match_font(fontname) – функция возвращающая путь к предустановленному шрифту по его имени.

Например, вот так можно получить список всех шрифтов, установленных на устройстве:

import pygame
pygame.init()
print( pygame.font.get_fonts() )

И выберем первый из них:

f_sys = pygame.font.SysFont('arial', 12)

На выходе получим экземпляр класса Font, на который ссылается переменная f_sys. Далее, уже используя эту переменную, мы можем работать с выбранным шрифтом.

Аналогично используется и второй класс:

f = pygame.font.Font('fonts/YandexSDLight.ttf', 24)

только здесь мы указываем полный путь к шрифту (обычно, это какой-либо нестандартный шрифт, который мы хотим использовать в нашей программе). Давайте нарисуем с его помощью текст. Программа будет выглядеть так:

import pygame
pygame.init()
 
W, H = 600, 400
 
sc = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Шрифты")
pygame.display.set_icon(pygame.image.load("app.bmp"))
 
clock = pygame.time.Clock()
FPS = 60
 
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (239, 228, 176)
 
f = pygame.font.Font('fonts/YandexSDLight.ttf', 24)
sc_text = f.render('Привет мир!', 1, RED, YELLOW)
pos = sc_text.get_rect(center=(W//2, H//2))
 
sc.fill(WHITE)
sc.blit(sc_text, pos)
pygame.display.update()
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
 
    clock.tick(FPS)

Смотрите, сначала вызывается метод render чтобы сформировать слой Surface, на котором будет написан текст «Привет мир!» выбранным шрифтом. Параметр 1 говорит, что нужно выполнять сглаживание границ букв (0 – без сглаживания), затем идет цвет текст и цвет фона. После этого мы получаем координаты прямоугольной области поверхности sc_text, расположенной по центру клиентской области окна приложения. И далее, с помощью уже известного метода blit отображаем текст в окне. Результат работы программы выглядит так:

Вот такие действия нужно выполнить для отображения текста в Pygame. Однако, если мы хотим использовать шрифт по умолчанию, используемый в этой библиотеке, то вместо имени шрифта, в приведенных выше классах, следует указывать значение None, например:

f = pygame.font.Font(None, 24)

В заключение этого занятия я приведу пример простой программы по перемещению изображения текста с помощью мышки (lesson 7.text_move.py: https://github.com/selfedu-rus/pygame):

import pygame
pygame.init()
 
W, H = 600, 400
 
sc = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Шрифты")
pygame.display.set_icon(pygame.image.load("app.bmp"))
 
clock = pygame.time.Clock()
FPS = 60
 
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (239, 228, 176)
 
print( pygame.font.get_fonts() )
 
f = pygame.font.Font('fonts/YandexSDLight.ttf', 24)
sc_text = f.render('Привет мир!', 1, RED, YELLOW)
pos = sc_text.get_rect(center=(W//2, H//2))
 
def draw_text():
    sc.fill(WHITE)
    sc.blit(sc_text, pos)
    pygame.display.update()
 
draw_text()
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
        elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            pygame.mouse.get_rel()   # обнуляем первое смещение (при повторном вызове ниже)
 
    if pygame.mouse.get_focused() and pos.collidepoint(pygame.mouse.get_pos()):
        btns = pygame.mouse.get_pressed()
        if btns[0]:     # нажата левая кнопка мыши
            rel = pygame.mouse.get_rel()    # получаем смещение
            pos.move_ip(rel)
            draw_text()
 
    clock.tick(FPS)

Смотрите, в главном цикле мы проверяем: находится ли курсор мыши в области окна приложения и располагается ли над текстом. Если это так, то далее проверяем: нажата ли левая кнопка мыши и при истинности проверки получаем смещение курсора мыши. Причем, первое смещение будет нулевым, т.к. выше при проверке события MOUSEBUTTONDOWN мы вызываем эту же функцию get_rel(), поэтому при ее повторном вызове она возвратит нулевые смещения. Далее, смещая курсор мыши переменная rel будет ссылаться на кортеж из значений смещения по координатам X и Y. Мы используем этот кортеж, чтобы изменить положение прямоугольника pos и отобразить текст с этими новыми координатами с помощью функции draw_text().

Вот так довольно просто выполняется работа с текстом в Pygame.