You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动