如何在Pygame中将SQLite数据渲染为对齐规整的排行榜表格
Pygame排行榜文本对齐解决方案
- 对齐失效核心原因:字符串格式化补空格的对齐逻辑仅对等宽字体生效,Pygame默认使用的普通非等宽字体中,每个字符、空格的渲染宽度都不相同,所以补多少空格都没法实现精准对齐。
方案1:拆分双列独立渲染(最推荐,兼容性最好)
直接把玩家名、得分拆成两个独立的文本对象分别渲染,固定玩家名列左对齐坐标,得分列按统一的右边缘基准坐标对齐,完全不受字体类型影响,修改后代码示例:
def leader_board(): i = 35 # 定义两个列的固定坐标:玩家名列左对齐X坐标,得分列右对齐基准X坐标 PLAYER_COL_X = dis_width / 5 SCORE_COL_RIGHT_X = dis_width * 3 / 5 # 可自行调整数值匹配你需要的得分表头位置 # 表头拆分渲染 player_header = font_style.render('PLAYER', True, yellow) dis.blit(player_header, [PLAYER_COL_X, (700 / 4) + 5]) score_header = font_style.render('SCORE', True, yellow) # 得分表头右对齐到预设的基准X坐标 dis.blit(score_header, [SCORE_COL_RIGHT_X - score_header.get_width(), (700 / 4) + 5]) cur.execute('SELECT * FROM snake_score ORDER BY score desc LIMIT 10') rows = cur.fetchall() for row in rows: # 玩家名左对齐渲染 player_text = font_style.render(str(row[0]), True, yellow) dis.blit(player_text, [PLAYER_COL_X, (700 / 4) + i + 5]) # 得分右对齐渲染:X坐标 = 基准右X - 得分文本自身宽度 score_text = font_style.render(str(row[1]), True, yellow) dis.blit(score_text, [SCORE_COL_RIGHT_X - score_text.get_width(), (700 / 4) + i + 5]) i += 35
方案2:切换为等宽字体
如果你不想改动现有渲染逻辑,可以直接把使用的字体替换为系统等宽字体,原有format格式化的代码就可以正常生效,字体初始化示例:
# 替换为系统自带的等宽字体,字号和你原有设置保持一致即可 font_style = pygame.font.SysFont('Courier', 24)
该方案缺点是依赖运行环境中存在你指定的等宽字体,否则会 fallback 到默认非等宽字体,仍然会出现对齐问题,仅适合本地自用场景。
内容的提问来源于stack exchange,提问作者Artis
相关产品推荐
相关产品推荐

