我想要在pygame中,实现一段话(每一行都等宽)的信息展示。
能否推荐一下比较好的做法,能实现比较规整的显示一段话?发信息也可以
目前我的做法是,比如txt是一段话,我先把txt中的换行符之类去掉。
然后,根据想要的段落的总宽度width和字体大小size,计算出一行有多少字。
然后根据一行字数,将txt切成若干单行,每行分别用font.render变成图像,并记录下它的位置。
然后把这些图像连同位置,作为返回值。
下面是代码:
def cut_txt(txt, num, labels=[]):
"""将字符串txt,每num个字符进行切片,返回切片的列表,labels应为空"""
txt = re.sub(r"\s", '', txt)
if len(txt) > num:
labels.append(txt[:num])
return cut_txt(txt[num:], num, labels)
else:
labels.append(txt)
return labels
def create_multi_label(txt, width=400, size=40, pos=(0, 0), color=(255, 255, 255)):
"""将一段话txt,以宽度width,字高size,坐标pos,颜色color的形式表现出来,返回每行字的图片,及其位置坐标"""
font = pygame.font.SysFont(C.FONT, size)
columns = ceil(width / size)
txt_list = cut_txt(txt, columns)
labels = []
for i in range(len(txt_list)):
label_img = font.render(txt_list[i], True, color)
# label_img = pygame.transform.scale(label_img, (width, size))
p = (pos[0], pos[1] + i * size)
# labels.append((surface, p))
labels.append((label_img, p))
return labels
但是结果是这样的:
就是说,存在以下问题:
1.每行的字数一样,但字数一样不代表宽度一样,特别是有符号(符号还分中英文)、数字时,所以最终无法实现很规整的效果。
2.字母也比较奇怪,比如图中那个q,它明显位置比较低。当然这一条不重要,在能解决问题1时可以顺便看看。
我想了一下,或者可以计算一段话的实际宽度(比如2个数字的宽度大概等于1个汉字),然后根据宽度重新排版,但是稍微一想就觉得好麻烦,是否能有朋友帮忙写下,或是提供思路——比如流程,用到的模块等