将窗口从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
相关产品推荐
相关产品推荐

