窗口无响应,关闭失败,报video system not initialized

这篇博客介绍了在使用Pygame创建主屏幕后遇到窗口无响应的问题及其解决方案。通过在while循环中监听并处理pygame.QUIT事件,可以避免窗口无响应。然而,仅使用pygame.quit()关闭程序会导致程序仍在后台运行,需要额外调用sys.exit()确保程序完全退出。正确代码示例展示了如何处理这两个问题。

用pygame生成主屏幕后,会产生无响应。如下图:
在这里插入图片描述正确做法后面必须写以下代码,否则界面会一直循环,导致无响应

    # 初始函数,使用 pygame 的第一步;
    pygame.init()  
    # 生成主屏幕
    screen = pygame.display.set_mode((600, 500), 0, 32)  
    # 设置标题
    pygame.display.set_caption('Hello Pygame')
    # 窗口无响应是因为没有任何注册在窗口上的事件
    # 为当前窗口增加事件
    # 利用pygame注册事件,其返回值是一个列表,
    # 存放当前注册时获取的所有事件
    while True: 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()

到这一步后,关闭会报错,如下图:在这里插入图片描述
因此后面还得加上sys.exit(),才能正常退出

    # 初始函数,使用 pygame 的第一步;
    pygame.init()  
    # 生成主屏幕
    screen = pygame.display.set_mode((600, 500), 0, 32)  
    # 设置标题
    pygame.display.set_caption('Hello Pygame')
    # 窗口无响应是因为没有任何注册在窗口上的事件
    # 为当前窗口增加事件
    # 利用pygame注册事件,其返回值是一个列表,
    # 存放当前注册时获取的所有事件
    while True:  
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()  # 如果没有sys.exit()系统还会运行下去,但是pygame已经卸载了。
import pygame import random import sys # 初始化pygame pygame.init() # 游戏配置 WIDTH, HEIGHT = 800, 600 # 窗口大小 BLOCK_SIZE = 20 # 蛇身和食物的方块大小 SPEED = 15 # 游戏速度 # 颜色定义(RGB) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) # 食物颜色 GREEN = (0, 255, 0) # 蛇身颜色 BLUE = (0, 0, 255) # 蛇头颜色 # 创建窗口 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("经典贪吃蛇游戏") # 时钟(控制游戏速度) clock = pygame.time.Clock() # 字体(显示分数和游戏结束信息) font = pygame.font.SysFont(None, 55) def draw_snake(snake): """绘制贪吃蛇""" for block in snake[:-1]: pygame.draw.rect(screen, GREEN, (block[0], block[1], BLOCK_SIZE, BLOCK_SIZE)) # 蛇头用不同颜色区分 pygame.draw.rect(screen, BLUE, (snake[-1][0], snake[-1][1], BLOCK_SIZE, BLOCK_SIZE)) def draw_food(food): """绘制食物""" pygame.draw.rect(screen, RED, (food[0], food[1], BLOCK_SIZE, BLOCK_SIZE)) def show_score(score): """显示分数""" text = font.render(f"分数: {score}", True, WHITE) screen.blit(text, (10, 10)) def game_over(score): """游戏结束界面""" screen.fill(BLACK) text1 = font.render(f"游戏结束!最终分数: {score}", True, RED) text2 = font.render("按 Q 退出 | 按 R 重新开始", True, WHITE) screen.blit(text1, (WIDTH//6, HEIGHT//3)) screen.blit(text2, (WIDTH//8, HEIGHT//2)) pygame.display.update() # 游戏结束后的操作 while True: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: # 退出游戏 pygame.quit() sys.exit() if event.key == pygame.K_r: # 重新开始 main() def main(): """游戏主函数""" # 蛇的初始状态(列表存储每个方块的坐标,最后一个元素是蛇头) snake = [ [WIDTH//2, HEIGHT//2], [WIDTH//2 - BLOCK_SIZE, HEIGHT//2], [WIDTH//2 - 2*BLOCK_SIZE, HEIGHT//2] ] direction = "RIGHT" # 初始移动方向 next_direction = direction # 缓冲方向(防止快速转向) # 食物初始位置(随机生成,与蛇身不重叠) def generate_food(): while True: food_x = random.randint(0, (WIDTH - BLOCK_SIZE) // BLOCK_SIZE) * BLOCK_SIZE food_y = random.randint(0, (HEIGHT - BLOCK_SIZE) // BLOCK_SIZE) * BLOCK_SIZE food = [food_x, food_y] if food not in snake: return food food = generate_food() score = 0 # 初始分数 while True: # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: # 关闭窗口 pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: # 键盘控制方向 if event.key == pygame.K_UP and direction != "DOWN": next_direction = "UP" elif event.key == pygame.K_DOWN and direction != "UP": next_direction = "DOWN" elif event.key == pygame.K_LEFT and direction != "RIGHT": next_direction = "LEFT" elif event.key == pygame.K_RIGHT and direction != "LEFT": next_direction = "RIGHT" # 更新移动方向 direction = next_direction # 计算蛇头新位置 head_x, head_y = snake[-1] if direction == "UP": head_y -= BLOCK_SIZE elif direction == "DOWN": head_y += BLOCK_SIZE elif direction == "LEFT": head_x -= BLOCK_SIZE elif direction == "RIGHT": head_x += BLOCK_SIZE # 添加新蛇头 snake.append([head_x, head_y]) # 碰撞检测 # 1. 撞墙 if (head_x < 0 or head_x >= WIDTH or head_y < 0 or head_y >= HEIGHT): game_over(score) # 2. 撞自己 if [head_x, head_y] in snake[:-1]: game_over(score) # 吃食物判断 if [head_x, head_y] == food: score += 10 # 分数增加 food = generate_food() # 重新生成食物 else: snake.pop(0) # 没吃到食物,删除蛇尾(蛇移动) # 绘制画面 screen.fill(BLACK) # 清空屏幕 draw_snake(snake) # 画蛇 draw_food(food) # 画食物 show_score(score) # 显示分数 pygame.display.update() # 更新画面 # 控制游戏速度 clock.tick(SPEED) # 启动游戏 if __name__ == "__main__": main() 这个代码在pycharm怎么运行不了
最新发布
11-14
### 视频系统未初始化错误的排查解决方案 在遇到“video system not initialized”错误时,通常表明视频系统在启动或运行过程中未能正确初始化,可能是由于软件配置问题、硬件连接故障或驱动程序异常导致。以下是针对此类问题的详细排查与解决方案: #### 1. 检查软件配置与依赖项 确保所有与视频系统相关的软件组件均已正确安装并配置。检查以下内容: - **依赖库是否完整**:视频系统通常依赖于特定的编解码库(如FFmpeg、OpenCV等),确保这些库已正确安装且版本兼容[^1]。 - **配置文件是否正确**:检查视频系统的配置文件(如`config.yaml`或`settings.json`)中是否包含正确的初始化参数,例如设备路径、分辨率、帧率等。 #### 2. 验证硬件连接与状态 如果视频系统依赖外部设备(如摄像头、采集卡等),需确认以下内容: - **设备是否正常连接**:检查视频设备是否正确连接至主机,接口(如USB、HDMI、SDI)是否松动或损坏。 - **设备驱动是否安装**:确保视频设备的驱动程序已安装并更新至最新版本。可通过设备管理器(Windows)或系统信息工具(macOS/Linux)查看设备状态。 - **设备是否被其他程序占用**:某些视频设备可能被其他应用程序(如视频会议软件)占用,尝试关闭相关程序后再启动视频系统。 #### 3. 日志分析与调试 启用系统日志记录功能,查看详细的错误信息。重点关注以下内容: - **初始化阶段的异常**:查找日志中与视频系统初始化相关的错误信息,例如“failed to open device”或“unable to allocate memory”。 - **调用堆栈信息**:若系统支持调试模式,查看调用堆栈以定位具体出错的模块或函数。 #### 4. 使用命令行工具进行测试 在Linux或macOS环境下,可使用命令行工具快速测试视频设备是否可用。例如,使用`v4l2-ctl`命令列出并测试视频设备: ```bash v4l2-ctl --list-devices v4l2-ctl --device=/dev/video0 --all ``` 在Windows环境下,可使用`DirectShow`工具或`OBS Studio`等第三方软件测试摄像头是否正常工作。 #### 5. 重新安装或更新软件组件 若上述步骤未能解决问题,建议尝试以下操作: - **重新安装视频系统软件**:卸载当前版本并重新安装最新版本,确保安装过程中无中断或权限问题。 - **更新驱动程序**:前往设备制造商官网下载并安装最新的驱动程序。 - **重置系统设置**:某些系统提供“恢复出厂设置”或“重置配置”功能,可尝试使用该功能清除可能存在的配置错误。 #### 6. 联系技术支持 若问题仍未解决,建议联系视频系统的技术支持团队,提供以下信息以协助排查: - 系统版本与架构(如Windows 10 64位、Ubuntu 22.04 LTS) - 视频设备型号与驱动版本 - 错误日志与截图(如有) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值