Как применить стиль css к тексту в pygame?

import pygame


class Text():
    def __init__(self, text):
        self.style = 'color: rgb(100, 100, 100);'
        self.text = text


if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((550, 800))
    run = True
    text = Text('Hello')
    while run:
        screen.fill('black')
        for i in pygame.event.get():
            if i.type == pygame.QUIT:
                run = False
        pygame.display.flip()
        pygame.time.Clock().tick(10)
    pygame.quit()

Как можно вывести self.text в стиле style?

+Я тут поэкспериментировал.

import pygame
import aspose.words as aw
import os.path
from PIL import Image
import time

class Text():
    def __init__(self, text):
        time_ = time.time()
        self.x = 0
        self.y = 0

        self.style = '"color: rgb(255, 255, 0); font-size: 100px;"'
        self.text = text

        if not os.path.isfile('blablabla.jpg'):
            doc = aw.Document()
            builder = aw.DocumentBuilder(doc)
            builder.insert_html(f'<p style="color: rgb(255, 255, 255);"> ne loh </p>')
            doc.save('blablabla.jpg')

        doc = aw.Document()
        builder = aw.DocumentBuilder(doc)
        builder.insert_html(f'<p style={self.style}> {self.text} </p>')
        doc.save("for_crop.jpg")

        image = Image.open('for_crop.jpg').convert('RGBA')
        pixels_for_image = image.load()
        x, y = image.width, image.height

        mask = Image.open('blablabla.jpg')
        pixels_for_mask = mask.load()

        x0, y0, x1, y1 = x, y, 0, 0 # Координаты для crop

        for i in range(x):
            for j in range(y):
                if pixels_for_image[i, j][:3] == pixels_for_mask[i, j]:
                    pixels_for_image[i, j] = (0, 0, 0, 0) # Очистка фона
                else:
                    if i < x0: x0 = i
                    if j < y0: y0 = j
                    if i > x1: x1 = i
                    if j > y1: y1 = j

        try:
            image.crop((x0, y0, x1, y1)).save('label.png') # Обрезание и сохранение
            
        except ValueError:
            print("ERROR: Coordinate 'right' is less than 'left'")
            self.label = pygame.surface.Surface((1, 1))
            
        else:
            self.label = pygame.image.load('label.png').convert_alpha()

    def set_position(self, xy):
        self.x, self.y = xy

    def pos(self):
        return (self.x, self.y)

    def render(self):
        return self.label


if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((550, 800))
    run = True

    text = Text('Hello')
    text.set_position((100, 100))

    while run:
        screen.fill((0, 0, 0))

        screen.blit(text.render(), text.pos())

        for i in pygame.event.get():
            if i.type == pygame.QUIT:
                run = False

        pygame.display.flip()
        pygame.time.Clock().tick(10)
    pygame.quit()

введите сюда описание изображения

Позади текста образуются белые пятна. Насколько я понял это проблема с прозрачным фоном. Как её можно решить?

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

+Проблему белых пятен я исправил заменив везде расширение jpg на bmp. Насколько я понял jpg использует "сжатие с потерями", в следствии чего не намного меняет значение каждого пикселя, из-за чего и возникают пятна.введите сюда описание изображения Пускай это уже удовлетворяет все мои условия, всё же хочется знать другой способ


Ответы (0 шт):