为什么我的简单Python Pygame程序运行后无法打开窗口?
问题汇总
运行环境:Windows 7宿主机搭载的Debian 11虚拟机
故障现象:
- 基于Pygame编写的测试代码运行后无游戏窗口弹出
- 控制台仅输出报错信息:
ALSA lib pcm.c:8424:(snd_pcm_recover) underrun occurred
问题对应代码:
import os, pygame os.environ["SDL_VIDEODRIVER"] = "dummy" pygame.init() dis = pygame.display.set_mode((400,300)) pygame.display.set_caption('Test') while 1 : pygame.display.update() pygame.quit() quit()
根因分析
- 窗口无法弹出的直接原因是代码中手动指定了SDL视频驱动为
dummy。该驱动是SDL提供的无界面虚拟渲染驱动,设计用途是无图形界面的服务器环境做离屏渲染测试,本身就不会弹出任何实体窗口。 - ALSA音频报错是因为
pygame.init()会默认初始化所有子模块包括音频模块,Debian虚拟机如果没有完成音频配置、没有直通宿主机音频设备,音频模块初始化时就会输出该underrun提示,该提示属于警告类信息,本身不会阻塞程序运行。 - 现有代码的主循环为无退出条件的死循环,即使窗口正常弹出也无法通过常规关闭按钮退出,会造成程序无响应。
修复步骤
- 删除
os.environ["SDL_VIDEODRIVER"] = "dummy"这行配置。在带图形桌面的Debian环境中,SDL会自动匹配对应图形驱动(X11/Wayland)正常渲染窗口。如果是通过SSH远程连接虚拟机运行代码,需要提前配置X11转发才能在本地看到窗口。 - 按需处理ALSA报错:
- 编写贪吃蛇阶段如果暂时不需要音频功能,将
pygame.init()替换为pygame.display.init(),仅初始化显示相关模块,从根源上跳过音频模块初始化,不会再触发ALSA相关报错。 - 后续需要接入音效时,先在Debian中执行
sudo apt install alsa-base alsa-utils安装ALSA基础组件,完成虚拟机音频设备到宿主机的直通配置即可正常使用音频功能。
- 编写贪吃蛇阶段如果暂时不需要音频功能,将
- 补充主循环的事件监听逻辑,添加退出判断,避免程序无响应。
修复后的可运行参考代码:
import pygame # 不需要音频时用这个初始化方式,需要音频换回pygame.init()并提前配置好声卡 pygame.display.init() dis = pygame.display.set_mode((400, 300)) pygame.display.set_caption('贪吃蛇测试') running = True while running: # 监听窗口关闭事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False pygame.display.update() pygame.quit()
内容的提问来源于stack exchange,提问作者Morgade
相关产品推荐
相关产品推荐

