我有一个输入框,其中放置了要渲染的文本。但是,如果文本超过一定长度,我希望将其显示在不同的行中。
我有一些看起来像这样的代码:
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...
答案 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()