已调用pygame.init()与sys.exit()仍出现‘video system not initialized’错误的排查求助
解决Pygame的“video system not initialized”错误
嘿,刚看完你的代码,马上就发现了几个关键问题导致这个错误,咱们一个个说清楚:
1. 事件判断的致命错误
你写的if event.type == pygame.quit()是完全错误的!pygame.quit()是主动退出Pygame的函数,不是事件类型常量。当事件循环触发这个判断时,它会立刻调用pygame.quit()关闭视频系统,但你的主循环还在继续运行,后面的pygame.draw.rect、pygame.display.flip()这些操作都依赖视频系统,自然就抛出“video system not initialized”错误了。
正确的写法应该是判断pygame.QUIT事件(注意全大写,这是Pygame定义的事件常量):
if event.type == pygame.QUIT: playing = False
2. 矩形绘制的参数错误
pygame.draw.rect的第三个参数需要是完整的Rect对象(包含x坐标、y坐标、宽度、高度四个值),你现在只传了pygame.Rect(x,y),缺少宽高参数,而且后面的60,60放错了位置。正确的写法应该把宽高整合到Rect对象里:
pygame.draw.rect(window, colour, pygame.Rect(x, y, 60, 60))
或者直接用元组(x, y, 60, 60)代替Rect对象也可以。
3. 小细节:移动方向搞反了
你写的向上移动是y +=3,向下是y -=3,但Pygame的坐标系里y轴是向下为正,所以向上移动应该是y -=3,向下是y +=3,不然移动方向会完全反过来,这个虽然不影响错误,但会影响你的操作体验~
修正后的完整代码
import pygame import sys pygame.init() window = pygame.display.set_mode([600,600]) playing = True blue = True x = 30 # Initial position x y = 30 # Initial position y while playing: for event in pygame.event.get(): # 修正事件判断:使用pygame.QUIT常量 if event.type == pygame.QUIT: playing = False if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: blue = not blue pressed = pygame.key.get_pressed() # 修正移动方向,符合Pygame坐标系规则 if pressed[pygame.K_UP]: y -= 3 if pressed[pygame.K_DOWN]: y += 3 if pressed[pygame.K_LEFT]: x -= 3 if pressed[pygame.K_RIGHT]: x += 3 # 可选优化:限制矩形在窗口内,防止移出屏幕 x = max(0, min(x, 600-60)) y = max(0, min(y, 600-60)) colour = (0,128,255) if blue else (255,100,0) # 修正Rect参数,传入完整的坐标和尺寸 pygame.draw.rect(window, colour, pygame.Rect(x, y, 60, 60)) pygame.display.flip() # 退出前可以先关闭Pygame,再终止程序 pygame.quit() sys.exit()
现在运行修正后的代码,应该就能正常工作啦!如果还有问题随时提~
内容的提问来源于stack exchange,提问作者Virat Kohli
相关产品推荐
相关产品推荐

