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

将窗口从main传入Asteroid文件时触发pygame.display Surface quit错误

问题:运行main.py时出现「pygame.error: display Surface quit」错误
  • 将窗口创建逻辑移至main.py并传递给Asteroid.py的Game类后出现该错误,未传递窗口时程序可正常运行
  • 注释掉self.screen.fill((self.red,self.green,self.blue))行后会触发字体相关错误

问题根源与修复方案

1. main.py中的核心错误

  • 错误实例化方式:手动调用game.__init__(windo)是错误操作,应在实例化时直接传递窗口参数;同时存在导入错误,需修正类导入路径
  • pygame.quit()位置错误:该语句被放在循环内部,导致第一次循环就关闭所有pygame资源,后续访问屏幕表面必然报错,需移至循环外部
  • 冗余代码:neat.config.Config未实际配置neat框架,可直接删除

2. Asteroid.py中的问题

  • 类属性与实例属性混淆:red、points等属性被定义为类属性,会导致所有Game实例共享数据,需改为实例属性放在__init__方法内
  • 模块末尾的pygame.quit():模块被导入时该语句会自动执行,直接关闭pygame资源,必须删除
  • input方法冗余逻辑:非up/return按键时重复调用loop()会导致渲染混乱,需删除该分支

修正后的代码

main.py

from Asteroid import Game  # 修正导入路径,类名为Game
import pygame

pygame.init()

Screenw, Screenh = 500, 500
windo = pygame.display.set_mode((Screenw, Screenh))

# 正确实例化Game类并传递窗口参数
game = Game(windo)

running = True

while running:
    game.loop()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            key = pygame.key.name(event.key)
            game.input(key)

# 退出循环后再关闭pygame资源
pygame.quit()

Asteroid.py

import pygame
import random

pygame.init()

class Game:
    def __init__(self, screen):
        pygame.display.set_caption("Asteroiiid")
        self.screen = screen
        # 将所有属性改为实例属性,避免类级别的数据共享
        self.red = random.randrange(256)
        self.green = random.randrange(256)
        self.blue = random.randrange(256)
        self.userred = 0
        self.usergreen = 0
        self.userblue = 0
        self.userlist = [self.userred, self.usergreen, self.userblue]
        self.points = 0
        self.teext = f"Points: {self.points}"
        self.i = 0
        self.screen.fill((255, 255, 255))

    def checker(self):
        righty = True
        if self.userlist[0] != self.red:
            righty = False
        else: 
            self.points += 1
        if self.userlist[1] != self.green:
            righty = False
        else: 
            self.points += 1
        if self.userlist[2] != self.blue:
            righty = False
        else: 
            self.points += 1
        if righty:
            self.points += 1
        self.red = random.randrange(256)
        self.green = random.randrange(256)
        self.blue = random.randrange(256)
        self.userlist[0] = 0
        self.userlist[1] = 0
        self.userlist[2] = 0 
        self.i = 0

    def loop(self):
        self.teext = f"Points: {self.points}"
        if self.i == 3:
            self.checker()      
        self.screen.fill((self.red, self.green, self.blue))
        font = pygame.font.SysFont("Arial", 24)
        score = font.render(self.teext, True, (0,0,0))
        redval = font.render(str(self.userlist[0]), True, (255,0,0))
        greenval = font.render(str(self.userlist[1]), True, (0, 255, 0))
        blueval = font.render(str(self.userlist[2]), True, (0,0,255))

        self.screen.blit(score,(0,0))
        self.screen.blit(redval,(400,100))
        self.screen.blit(greenval,(400,200))
        self.screen.blit(blueval,(400,300))
        pygame.display.flip()

    def input(self, key):
        if key == 'up':
            self.userlist[self.i] += 1
        if key == 'return':
            self.i += 1
        # 删除冗余的else分支,避免重复调用loop导致渲染异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:01:01