Pygame-无法将整个文本放在不同的行中

时间:2019-04-13 11:32:50

标签: python pygame

我有一个输入框,其中放置了要渲染的文本。但是,如果文本超过一定长度,我希望将其显示在不同的行中。

我有一些看起来像这样的代码:

 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 个答案:

答案 0 :(得分:1)

行数的计算错误。行数是除法len(text) // max_length + 1的组成部分,除非文本的长度恰好是行数的倍数。这意味着如果+1的余数大于0,则必须进行len(text) % max_length

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的文本逐行{:{1}}:

screen

完整功能可能如下所示:

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