pygame调用p.draw绘制棋盘无显示 报SIGABRT段错误异常
故障根因
代码存在两处核心错误,直接导致崩溃和渲染失败:
- 退出事件判断写法完全错误:
p.quit()是主动销毁pygame运行环境的函数,你在事件判断分支里写e.type == p.quit(),会在主循环第一次遍历事件时就直接执行该函数,把包括screen显示表面在内的所有pygame资源全部释放。后续drawBoard()还尝试向已经释放的无效内存区域写入绘制数据,直接触发段错误,也就是日志里打印的pygame_parachute: Segmentation Fault。正确的退出事件是pygame定义的常量p.QUIT,是固定枚举值,不需要加括号调用。 - 缺少屏幕刷新步骤:pygame所有绘制操作默认都写入后台缓冲区,不会直接显示到窗口上,必须在每帧绘制完成后调用刷新接口,否则就算不崩溃,窗口也只会显示初始填充的紫色,看不到棋盘内容。
修复步骤
- 修正退出事件判断:把
if e.type == p.quit():替换为if e.type == p.QUIT: - 在主循环的绘制逻辑后添加屏幕刷新接口:调用
p.display.update()将后台缓冲区的绘制内容同步到窗口 - (可选)添加帧率控制,避免主循环无限制跑满CPU占用,循环正常退出后再调用
p.quit()清理环境
修复后可运行代码
import pygame as p WIDTH = 1080 HEIGHT = 720 BOARD_WIDTH = 448 # 64*7 BOARD_HEIGHT = 576 # 64*9 DIMENSION_ROW = 9 DIMENSION_COL = 7 SQUARE_SIZE = 64 MAX_FPS = 28 IMAGES = {} MOVE_LOG_PANEL_WIDTH = 0 def main(): p.init() screen = p.display.set_mode((WIDTH, HEIGHT)) clock = p.time.Clock() screen.fill(p.Color("purple")) running = True while running: for e in p.event.get(): if e.type == p.QUIT: running = False drawBoard(screen) p.display.update() clock.tick(MAX_FPS) p.quit() def drawBoard(screen): colors = [p.Color("white"), p.Color("gray")] for r in range(DIMENSION_ROW): for c in range(DIMENSION_COL): color = colors[((r + c) % 2)] p.draw.rect(screen, color, p.Rect(c * SQUARE_SIZE, r * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE)) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Claudio Savelli
相关产品推荐
相关产品推荐

