Pygame自定义窗口类触发display Surface quit错误求助
问题1:报错的具体触发原因
- 第一,
__init__中直接对self赋值属于无效操作。Python的__init__方法里的self是已经创建完成的类实例的引用,你把它重新赋值为pygame.display.set_mode的返回值,仅会修改__init__内部的局部变量,不会改变外部实际拿到的Screen类实例,你用set_mode创建的合法显示Surface会直接被丢弃。 - 第二,你的
Screen类继承了pygame.Surface但没有调用父类的初始化方法,导致最终拿到的scr实例是未初始化的无效Surface对象,你调用_fill时操作的就是这个无效对象,pygame无法识别合法显示Surface,就抛出了对应报错。 - 第三,你全程没有调用
pygame.init()初始化pygame的核心模块,本身就会导致pygame接口调用异常。
问题2:自定义窗口类的正确实现方式
以下提供两种可行实现方案:
方案1:组合实现(更推荐,逻辑更清晰不易冲突)
ScreenClass.py 代码
import pygame import sys class Screen: """自定义窗口类""" def __init__(self, width: int, height: int): # 初始化pygame核心模块 pygame.init() # 存储创建好的合法显示Surface self.display_surf = pygame.display.set_mode((width, height)) def events_handler(self): """全局事件处理""" for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() def fill(self, color): """填充窗口底色""" self.display_surf.fill(color) def update(self): """刷新窗口画面,必须调用否则填充内容不会显示到屏幕""" pygame.display.flip()
主程序代码
import ScreenClass import StaticsClass # 你的颜色常量类 def main(): scr = ScreenClass.Screen(800, 600) while True: scr.fill(StaticsClass.Color.BLACK0) scr.events_handler() scr.update() if __name__ == '__main__': main()
方案2:继承实现(需要用到pygame.Surface原生方法时可选)
通过重写__new__方法替换实例创建逻辑,直接返回set_mode创建的Surface实例,同时保留自定义类的方法:
import pygame import sys class Screen(pygame.Surface): def __new__(cls, width: int, height: int): pygame.init() # 直接返回显示Surface作为类实例 return pygame.display.set_mode((width, height)) def events_handler(self): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit()
该方案下可直接调用pygame.Surface的原生fill方法,不需要额外封装,主程序中直接执行scr.fill(颜色值)即可。
内容的提问来源于stack exchange,提问作者Cold Fire
相关产品推荐
相关产品推荐

