You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame退出后screen.blit()仍执行引发display Surface quit错误求助

解决方案:Pygame退出时display Surface quit错误修复

核心问题本质

你遇到的错误确实是因为pygame.quit()销毁了显示表面后,后续循环仍在执行screen.blit()等依赖显示表面的操作。关键是要确保所有绘制/逻辑循环完全终止后,再执行Pygame的清理操作。

具体修复步骤

1. 统一全局状态管理

用布尔变量控制所有循环的生命周期,避免在循环内直接调用pygame.quit():

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600))

# 全局状态变量:控制整个程序的运行
running = True
# 区分菜单/游戏场景
in_menu = True

2. 重构循环结构

将菜单和主游戏循环嵌套在一个总循环内,用状态变量切换场景,退出时仅修改状态而非直接清理:

# 菜单元素示例(根据你的实际代码调整)
start_btn = pygame.Rect(300, 200, 200, 50)
quit_btn = pygame.Rect(300, 300, 200, 50)

# 游戏元素示例
player1 = pygame.Surface((20, 100))
player1.fill((255,255,255))
player1x, player1y = 50, 250

while running:
    # 菜单场景逻辑
    if in_menu:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            # 鼠标点击事件处理
            if event.type == pygame.MOUSEBUTTONDOWN:
                if start_btn.collidepoint(event.pos):
                    in_menu = False
                elif quit_btn.collidepoint(event.pos):
                    running = False
        
        # 菜单绘制
        screen.fill((0,0,0))
        pygame.draw.rect(screen, (0,255,0), start_btn)
        pygame.draw.rect(screen, (255,0,0), quit_btn)
        pygame.display.update()
    
    # 主游戏场景逻辑
    else:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            # 其他游戏事件(按键、碰撞等)
    
        # 游戏逻辑更新(小球移动、碰撞检测等)
        # ...
        
        # 游戏绘制
        screen.fill((0,0,0))
        screen.blit(player1, (player1x, player1y))
        # ...绘制其他元素
        pygame.display.update()

# 所有循环终止后,再执行清理操作
pygame.quit()
sys.exit()

3. 排查常见错误点

  • 如果你之前用了全局running但未生效,检查是否在函数内部修改时忘记声明global running;
  • 移除所有循环内的pygame.quit()调用,仅保留在最外层循环结束后执行;
  • 确保没有额外的线程或独立循环在主流程外运行(Pygame不建议用多线程处理绘制逻辑)。

关键原理

这种结构通过状态变量running和in_menu统一控制程序流程,所有绘制操作都在running为True时执行,当需要退出时仅修改状态,让循环自然结束后再清理Pygame资源,从根源避免了销毁显示表面后仍执行绘制的问题。

内容的提问来源于stack exchange,提问作者Anmol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:25:37