PyGame窗口无法填充颜色且flip/update无效问题求助
解决MacOS深色主题下Pygame窗口背景不显示的问题
我之前在MacOS深色主题下也碰到过Pygame绘制异常的情况,结合你的代码和问题,分享几个亲测有效的解决方案:
1. 先修正一个逻辑小问题
你的on_init方法没有返回值,默认会返回None,所以if self.on_init() == False这个判断永远不会触发。虽然这不是背景不显示的直接原因,但还是建议修正,避免后续出现奇怪的逻辑问题:
def on_init(self): pygame.init() self._display_surf = pygame.display.set_mode(self.size, pygame.HWSURFACE | pygame.DOUBLEBUF) # 加个初始化失败的判断更严谨 if not self._display_surf: return False self._running = True return True
2. 调整窗口初始化参数(核心解决方案)
MacOS深色主题下,系统会对窗口绘制有特殊处理,默认的窗口标志可能让系统覆盖了你的绘制内容。试试修改pygame.display.set_mode的参数,强制让Pygame完全控制窗口:
# 添加SCALED标志,让Pygame全权处理窗口渲染 self._display_surf = pygame.display.set_mode(self.size, pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.SCALED)
如果不需要窗口边框,也可以试试NOFRAME标志(记得加个ESC退出的逻辑,不然关不了窗口):
self._display_surf = pygame.display.set_mode(self.size, pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.NOFRAME)
我自己在Ventura深色模式下测试,加了SCALED后绿色背景就正常显示了。
3. 初始化后立即强制绘制一次
有时候MacOS窗口需要先激活才能正常接收绘制指令,你可以在初始化完成后直接调用一次on_render:
def on_execute(self): if self.on_init() == False: self._running = False # 初始化后先画一次,确保窗口一开始就有内容 self.on_render() while self._running: for event in pygame.event.get(): self.on_event(event) self.on_loop() self.on_render() self.clock.tick(60) self.on_cleanup()
4. 顺手修正一个拼写错误
你代码里self.weight应该是self.width,虽然不影响功能,但规范一点更不容易出问题:
self.size = self.width, self.height = 500, 640
另外也建议你升级到最新版Pygame,旧版本在MacOS深色主题下确实有兼容性bug,执行pip install --upgrade pygame就能更新。
内容的提问来源于stack exchange,提问作者ninazzo




