Pygame - Невозможно поместить весь текст в разные строки - PullRequest
1 голос
/ 13 апреля 2019

У меня есть поле ввода, в которое помещается текст для визуализации.Однако, если текст превышает определенную длину, я хочу, чтобы он отображался в разных строках.

У меня был какой-то код, который выглядит следующим образом:

 def scale_box(self, screen, text):
        max_length = 10
        nb_lines = int(len(text) / max_length)
        index = 0
        self.box.y -= nb_lines * self.coords[3]
        self.box.h *= nb_lines
        y = self.box.y
        for i in range(0, nb_lines + 1):
            line = text[index: index + max_length]
            index += max_length
            Line = self.box_font.render(line, True, self.font_color)
            screen.blit(Line, (self.box.x + 10, y))
            y += self.coords[3]

Итак, размер (размеры) поля ввода обновляется в зависимости от длины текста.Этот метод вызывается, когда происходит определенное событие.

И где-то в «основном» коде

    screen.blit(self.text_box, (self.box.x + 10, self.box.y + 10))

Например, если текст = «Что-то написано здесь ...».Я хочу получить что-то вроде этого:

Something 
written he
re...

Но я получаю только последнюю строку:

re...

1 Ответ

1 голос
/ 13 апреля 2019

Расчет количества строк неверен.Количество строк является неотъемлемой частью деления len(text) // max_length + 1, за исключением того, что текст имеет длину, равную числу строк.Это означает, что +1 необходимо выполнить, если остаток len(text) % max_length больше 0:

nb_lines = len(text) // max_length + (1 if len(text) % max_length > 0 else 0)

Разделить текст и отобразить его в списке поверхностей:

lines = []
for i in range(nb_lines):
    linetext = text[i*max_length : (i+1)*max_length]
    lines.append( self.box_font.render(linetext, True, self.font_color) )

Рассчитатьширина и высота текстового блока, смещение и обновление в текстовом поле:

width = max([l.get_width() for l in lines])
height = sum([l.get_height() for l in lines])
y = self.box.y - nb_lines * self.coords[3]

self.box = pygame.Rect(self.box.x, y, width, height)

Наконец blit текст в screen, строка за строкой:

y = self.box.y
for l in lines:
    screen.blit(l, (self.box.x + 10, y))  
    y += l.get_height() 

Полная функция может выглядеть так:

def scale_box(self, screen, text):

    max_length = 10
    nb_lines = len(text) // max_length + (1 if len(text) % max_length > 0 else 0)
    lines = []
    for i in range(nb_lines):
        linetext = text[i*max_length : (i+1)*max_length]
        lines.append( self.box_font.render(linetext, True, self.font_color) )

    width = max([l.get_width() for l in lines])
    height = sum([l.get_height() for l in lines])
    y = self.box.y - nb_lines * self.coords[3]
    self.box = pygame.Rect(self.box.x, y, width, height)

    y = self.box.y
    for l in lines:
        screen.blit(l, (self.box.x + 10, y))  
        y += l.get_height() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...