Расчет количества строк неверен.Количество строк является неотъемлемой частью деления 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()