Разместить текст на существующей поверхности в Pygame

python-3.x pygame

153 просмотра

1 ответ

4124 Репутация автора

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

Для создания текста в Pygame я:

  1. Создание объекта шрифта. Например:font = pygame.font.SysFont('Arial', 32)
  2. Создание текстовой поверхности из объекта шрифта. Например:text = font.render('My text', True, (255, 255, 255))
  3. Перекрытие текстовой поверхности.

Проблема в том, что мне сначала нужно создать объект шрифта определенного размера, прежде чем создавать текстовую поверхность. Я создал функцию, которая делает то, что я хочу:

import pygame
import sys

def get_text(surface, text, color=(255, 255, 255), max_size=128, font_name='Arial'):
    """ Returns a text surface that fits inside given surface. Text
        will have a font size of 'max_size' or less.
    """
    surface_width, surface_height = surface.get_size()
    lower, upper = 0, max_size
    while True:
        font = pygame.font.SysFont(font_name, max_size)
        font_width, font_height = font.size(text)

        if upper - lower <= 1:
            return font.render(text, True, color)
        elif max_size < 1:
            print("Text can't fit in the given surface.", file=sys.stderr)
            raise ValueError
        elif font_width > surface_width or font_height > surface_height:
            upper = max_size
            max_size = (lower + upper) // 2
        elif font_width < surface_width or font_height < surface_height:
            lower = max_size
            max_size = (lower + upper) // 2
        else:
            return font.render(text, True, color)

Есть ли другой способ решить эту проблему, который чище и / или более эффективен?

Автор: Ted Klein Bergman Источник Размещён: 18.07.2016 01:25

Ответы (1)


0 плюса

4124 Репутация автора

Решение

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

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

Автор: Ted Klein Bergman Размещён: 27.07.2018 11:34
Вопросы из категории :
32x32