Шрифты в python pygame
Whether the font should be rendered in italic.
When set to True, this enables fake rendering of italic text. This is a fake skewing of the font that doesn’t look good on many font types. If possible load the font from a real italic font file. While italic the font will have a different width than when normal. This can be mixed with the bold, underline and strikethrough modes.
Whether the font should be rendered in underline.
When set to True, all rendered fonts will include an underline. The underline is always one pixel thick, regardless of font size. This can be mixed with the bold, italic and strikethrough modes.
Whether the font should be rendered with a strikethrough.
When set to True, all rendered fonts will include an strikethrough. The strikethrough is always one pixel thick, regardless of font size. This can be mixed with the bold, italic and underline modes.
Can be set to pygame.FONT_LEFT , pygame.FONT_RIGHT , or pygame.FONT_CENTER . This controls the text alignment behavior for the font.
Requires pygame built with SDL_ttf 2.20.0, as all official pygame distributions are.
This creates a new Surface with the specified text rendered on it. pygame.font pygame module for loading and rendering fonts provides no way to directly draw text on an existing Surface: instead you must use Font.render() to create an image (Surface) of the text, then blit this image onto another Surface.
Null characters (‘x00’) raise a TypeError. Both Unicode and char (byte) strings are accepted. For Unicode strings only UCS-2 characters (‘\u0001’ to ‘\uFFFF’) were previously supported and any greater unicode codepoint would raise a UnicodeError. Now, characters in the UCS-4 range are supported. For char strings a LATIN1 encoding is assumed. The antialias argument is a boolean: if True the characters will have smooth edges. The color argument is the color of the text [e.g.: (0,0,255) for blue]. The optional bgcolor argument is a color to use for the text background. If bgcolor is None the area outside the text will be transparent.
The wraplength argument describes the width (in pixels) a line of text should be before wrapping to a new line. See pygame.font.Font.align Set how rendered text is aligned when given a wrap length for line-alignment settings.
The Surface returned will be of the dimensions required to hold the text. (the same as those returned by Font.size() ). If an empty string is passed for the text, a blank surface will be returned that is zero pixel wide and the height of the font.
Depending on the type of background and antialiasing used, this returns different types of Surfaces. For performance reasons, it is good to know what type of image will be used. If antialiasing is not used, the return image will always be an 8-bit image with a two-color palette. If the background is transparent a colorkey will be set. Antialiased images are rendered to 24-bit RGB images. If the background is transparent a pixel alpha will be included.
Optimization: if you know that the final destination for the text (on the screen) will always have a solid background, and the text is antialiased, you can improve performance by specifying the background color. This will cause the resulting image to maintain transparency information by colorkey rather than (much less efficient) alpha values.
Font rendering is not thread safe: only a single thread can render text at any time.
Changed in pygame 2.0.3: Rendering UCS4 unicode works and does not raise an exception. Use if hasattr(pygame.font, «UCS4»): to see if pygame supports rendering UCS4 unicode including more languages and emoji.
Changed in pygame-ce 2.1.4: newline characters now will break text into multiple lines.
New in pygame-ce 2.1.4: wraplength parameter
Как рисовать текст различными шрифтами
На этом занятии мы с вами разберемся как в Pygame происходит отображение текста разными шрифтами. И начнем со шрифтов. Для работы с ними имеется встроенный модуль:
- 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, например:
В заключение этого занятия я приведу пример простой программы по перемещению изображения текста с помощью мышки (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.