You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pygame.error: video system not initialized错误原因及修复方案求助

问题分析与修复方案

错误含义解释

这个pygame.error: video system not initialized错误的意思是:你在Pygame的视频系统已经被关闭的情况下,还尝试调用需要依赖视频系统的操作。在你的代码里,就是触发窗口关闭事件后,视频系统已经被pygame.quit()关掉了,但后续的pygame.display.flip()还在尝试执行,这就导致了报错。

代码问题根源

看你的事件处理逻辑:

if event.type == pygame.QUIT:
    pygame.quit()
    sys.exit()

当你点击窗口关闭按钮时,代码先调用pygame.quit()关闭了所有Pygame模块(包括视频系统),然后调用sys.exit()。理论上sys.exit()会直接终止程序,但有时候因为Python的执行顺序,当前循环的剩余代码(也就是pygame.display.flip())可能还会被执行一次——这时候视频系统已经不存在了,自然就抛出错误。

修复方法

有两种简单可靠的修复方式,选哪种都可以:

方式1:控制循环状态,在循环外清理退出

把代码改成用一个标志变量控制主循环,这样可以确保所有Pygame清理操作都在循环结束后执行,不会出现操作已关闭系统的情况:

import sys
import pygame

def run_game():
    pygame.init()
    screen = pygame.display.set_mode((1200, 800))
    pygame.display.set_caption("Alien Invasion")
    
    # 新增循环控制标志
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        
        pygame.display.flip()
    
    # 循环结束后再清理并退出
    pygame.quit()
    sys.exit()

run_game()

方式2:交换pygame.quit()和sys.exit()的顺序

sys.exit()会直接终止Python解释器,所以把它放在前面,这样pygame.display.flip()就不会有机会执行了:

import sys
import pygame

def run_game():
    pygame.init()
    screen = pygame.display.set_mode((1200, 800))
    pygame.display.set_caption("Alien Invasion")
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()  # 先终止程序
                pygame.quit()  # 这句其实不会执行,但保留也没关系
        
        pygame.display.flip()

run_game()

不过更推荐第一种方式,因为它的逻辑更清晰,也符合资源清理的最佳实践——先结束业务逻辑,再清理资源,最后退出。

内容的提问来源于stack exchange,提问作者srinivas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:55:06