Как вывести текст в pygame
Перейти к содержимому

Как вывести текст в pygame

  • автор:

Как вывести какой-то текст в какую-то точку экрана?

Я с помощью модуля pygame сделал окно 500×500 пикселей. Как вывести какой-то текст в какую-то точку экрана?

Отслеживать
12.3k 1 1 золотой знак 20 20 серебряных знаков 42 42 бронзовых знака
задан 11 июл 2019 в 17:22
HackerLacker HackerLacker
11 1 1 серебряный знак 3 3 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

import pygame pygame.init() sc = pygame.display.set_mode((300,200)) sc.fill((255, 255, 255)) f1 = pygame.font.Font(None, 36) text1 = f1.render('Hello Привет', 1, (180, 0, 0)) sc.blit(text1, (10, 50)) pygame.display.update() while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: exit() 

Отслеживать
ответ дан 11 июл 2019 в 17:35
7,195 10 10 золотых знаков 38 38 серебряных знаков 68 68 бронзовых знаков
pygame.display.update() должен быть внутри основного цикла
28 мар 2022 в 7:11

  • python
  • графика
  • pygame
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420

Python and PyGame. Работа с текстом.

В этом посте, я бы хотел остановиться на некоторых основных приемах работы с текстом, шрифтами в библиотеке PyGame. За основу будут взяты строки из документации, сдобренные наглядными примерами. И так, начнем:)

1. Введение.

Первое, что хотелось бы упомянуть, так это то, что текст, в PyGame, обрабатывается и выводится не как, собственно текст (каша, да?)), а как некая поверхность (в оригинале Surface), также как и любые другие объекты (фон, игровоые объекты). От сюда вытекает, что сначало его (текст), нужно отрендерить (собственно превратить строку в поверхность), а потом «нарисовать” методом blit поверх другой поверхности. Также, можно догадаться что по умолчанию нельзя взаимодействовать с выведенным текстом, так, как мы привыкли, т.е. выделять, копировать.

2. Описание модуля pygame.font.

Описание переведено из оригинальной документации. Там же, можно почерпнуть более полные сведения, т.к. здесь я приведу, на мой взгляд самое основное.

pygame.font.init – собственно инициализация модуля font
pygame.font.quit – соответсвенно «разинициализация” 🙂
pygame.font.get_default_font – возвращает имя шрифта по умолчанию
pygame.font.get_fonts – возвращает список всех доступных в системе шрифтов pygame.font.match_font – ищет заданный шрифт в системе, и выводит путь до него pygame.font.Font – создает новый объект (FontObject) для использования в программе.

Например:
Создадим окно и объект шрифт, из *.tff шрифта Arial, размером 25.

  1. # -*- coding: cp1251 -*-
  2. # Пример работы со шрифтом и текстом в pygame.
  3. from pygame import *
  4. import sys
  5. init ( )
  6. screen = display. set_mode ( ( 320 , 240 ) )
  7. # Заливаем окно черным цветом
  8. screen. fill ( ( 0 , 0 , 0 ) )
  9. # Устанавливаем название окна
  10. display. set_caption ( ‘font_example’ )
  11. font. init ( )
  12. path = font. match_font ( «arial» )
  13. Font = font. Font ( path, 25 )

Модуль позволяет работать с *.ttf файлами шрифтов. Остановимся подробнее на методах, применимых к функции pygame.font.Font. Она содержит все необходимое для отрисовки текста:
Font.render – рендерит исходный текст (строку) в поверхность.
Font.render (text, antialias, color, background=None): return Surface
где:
text – строка, которую будем выводить на экран. Не поддерживается перенос строк, поэтому непечатные символы будет напечатаны в виде крягозяк))).
antialias – сглаживание. Для хорошего вида, лучше всегда ставить 1
color – цвет текста в виде кортежа (R, G, B)
background – фон. Также кортеж (R, G, B)

  1. text = ‘hello world!’
  2. # Рендерим
  3. a = Font. render ( text, 1 , ( 100 , 100 , 100 ) )
  4. # Рисуем отрендеренный текст в созданном окне
  5. screen. blit ( a, ( 160 , 110 ) )
  6. while 1 :
  7. for i in event. get ( ) :
  8. if i. type == QUIT: # Обрабатываем событие щелчка по крестику закрытия окна
  9. sys . exit ( )
  10. display. flip ( ) # Обновляем экран

Font.set_underline (int) / Font.set_bold (int) / Font.set_italic (int) — делают шрифт соответсвенно подчеркнутым, жирным и курсивом. В качестве аргуемента принимают:
0 или False – не делать ничего, и все остальные цифры или True – применить. Должно стоять до рендеринга текста.
Font.get_underline / Font.get_bold / Font.get_italic – проверяют, является ли текст, подчеркнутым, жирным или курсивом. Возвращает или True или False.

3. Итого.

Вот и все. Я описал основные, на мой взгляд методы форматирования текста в pygame. Если же, при помощи событий, организовать перехват нажатий клавиш, то можно сделать простой ввод \ вывод данных в игре или игро-подобном приложении.
______________________

Модуль pygame.font

Классы Font и SysFont находятся в модуле pygame.font и предназначены для работы со шрифтами и текстом. Чтобы создавать от этих классов объекты, модуль pygame.font необходимо предварительно инициализировать командой pygame.font.init() , или выполнить инициализацию всех вложенных модулей библиотеки Pygame командой pygame.init() .

От классов pygame.font.Font и pygame.font.SysFont создаются объекты-шрифты. Второй класс берет системные шрифты, поэтому конструктору достаточно передать имя шрифта. Конструктору Font надо передавать имя файла шрифта. Например:

pygame.font.SysFont('arial', 36) pygame.font.Font('/адрес/Arial.ttf', 36)

Пример полного адреса в системе Linux – «/usr/share/fonts/truetype/msttcorefonts/Arial.ttf».

Второй аргумент – это размер шрифта в пикселях.

Узнать, какие шрифты есть в системе, можно с помощью функции get_fonts() :

>>> pygame.font.get_fonts() ['cmmi10', 'umeminchos3', 'kacstbook' .

Узнать адрес конкретного шрифта:

>>> pygame.font.match_font('verdana') '/usr/share/fonts/. /Verdana.ttf'

Вы можете скопировать шрифт в каталог программы и обращаться к нему без адреса:

pygame.font.Font('Verdana.ttf', 24)

В pygame есть шрифт по-умолчанию. Чтобы использовать его, вместо имени файла в конструктор надо передать объект None :

pygame.font.Font(None, 24)

От обоих классов ( Font и SysFont ) создаются объекты типа Font .

Метод render() экземпляра Font создает поверхность (экземпляр Surface ), на которой «написан» переданный в качестве аргумента текст, шрифтом, к которому применяется метод. Вторым аргументом указывается сглаживание, третьим – цвет текста. При необходимости четвертым аргументом можно указать цвет фона.

import pygame import sys pygame.font.init() sc = pygame.display.set_mode((300, 200)) sc.fill((255, 255, 255)) f1 = pygame.font.Font(None, 36) text1 = f1.render('Hello Привет', True, (180, 0, 0)) f2 = pygame.font.SysFont('serif', 48) text2 = f2.render("World Мир", False, (0, 180, 0)) sc.blit(text1, (10, 50)) sc.blit(text2, (10, 100)) pygame.display.update() while 1: for i in pygame.event.get(): if i.type == pygame.QUIT: sys.exit() 

Текст в Pygame

Рассмотрим такой пример:

import pygame as pg import sys pg.init() sc = pg.display.set_mode((400, 300)) sc.fill((200, 255, 200)) font = pg.font.Font(None, 72) text = font.render("Hello Wold", True, (0, 100, 0)) place = text.get_rect(center=(200, 150)) sc.blit(text, place) pg.display.update() while 1: for i in pg.event.get(): if i.type == pg.QUIT: sys.exit() pressed = pg.key.get_pressed() if pressed[pg.K_LEFT]: place.x -= 1 elif pressed[pg.K_RIGHT]: place.x += 1 sc.fill((200, 255, 200)) sc.blit(text, place) pg.display.update() pg.time.delay(20)

Центрирование текста в Pygame

Вспомним, что метод get_rect() экземпляра Surface возвращает объект типа Rect , чьи размеры соответствуют размерам поверхности.

Поскольку у самой поверхности нет собственных свойств-координат на родительском окне, а у Rect они есть, то по умолчанию, если get_rect() применяется без аргументов, для его верхнего левого угла устанавливаются координаты (0, 0).

В нашем примере мы передаем в get_rect() значение для свойства center порождаемой прямоугольной области. Это свойство определяет координаты центра экземпляра Rect (то, что это еще и центр главного окна, неважно). При этом остальные координаты, в том числе координаты верхнего левого угла, вычисляются автоматически, исходя из установленного центра и размеров поверхности.

Поэтому, когда вызывается метод blit() , в который в качестве второго аргумента передается созданный экземпляр Rect , то из последнего берутся координаты верхнего левого угла. Но они уже не (0, 0), а имеют значения, которые равны свойству centerx минус половина ширины и centery минус половина высоты прямоугольной области или соответствующей ей поверхности.

При зажиме стрелок на клавиатуре координата x прямоугольника меняется. В результате метод blit() рисует поверхность в новых координатах.

Практическая работа

У объектов Rect есть метод contains() , который проверяет, заключает ли в себе одна область (к которой применяется метод) другую (которая передается в качестве аргумента).

Напишите программу, в которой, если одна поверхность попадает в пределы другой, то на главной поверхности появляется какая-либо надпись. «Подвижный» экземпляр Surface должен переноситься с помощью мыши.

Курс с примерами решений практических работ:
pdf-версия

X Скрыть Наверх

Pygame. Введение в разработку игр на Python

Почему не появляется текст на экране pygame?

Есть такой код для вывода текста на экран, планирую использовать вывод текста после попадания по персонажу. Но выводится такая ошибка —
f1 = pygame.font.Font(None, 36)
pygame.error: font not initialized
в чем может быть проблема?

  • Вопрос задан более трёх лет назад
  • 1121 просмотр

Комментировать

Решения вопроса 1

Проблема в инициализации.
Для конструктора pygame.font.Font надо передавать имя файла шрифта.
Если же вы хотите использовать системные шрифты, то надо использовать другой конструктор. Пример:
f1 = pygame.font.SysFont(‘arial’, 36)
В данном случае я указал шрифт Arial, можете указать любой присутствующий в вашей системе.
Ну и конечно вначале у вас должна быть инициализация системы шрифтов:
pygame.font.init()

Ответ написан более трёх лет назад

Нравится 1 1 комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *