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

树莓派中Python键盘事件无响应求助:代码无报错但无反应

解决树莓派上Python键盘检测无响应的问题

这种情况我在树莓派上折腾过好多次,大概率是权限不足或者输入设备访问配置的问题,给你几个靠谱的排查方向:

  • 先解决最常见的权限问题
    树莓派的普通用户默认没有访问输入设备(比如键盘)的权限,因为键盘对应的设备文件在/dev/input/目录下,属于input用户组。你需要把当前用户加入这个组:

    sudo usermod -aG input $USER
    

    执行完后注销当前用户再重新登录,或者直接重启树莓派,让权限生效。

  • 确认键盘能被系统识别
    先排除硬件或者系统层面的问题,安装evtest工具来测试键盘事件:

    sudo apt update && sudo apt install evtest
    

    运行sudo evtest,会列出所有输入设备,选择你的键盘对应的编号(比如event0或者event1),然后按w键,如果能看到输出的按键事件,说明系统能正常识别键盘,问题出在Python代码层面;如果没反应,那可能是键盘硬件或者连接的问题。

  • 针对keyboard库的调整
    如果权限没问题,试试手动指定键盘设备路径给keyboard库。先找到你的键盘设备:

    ls /dev/input/by-id/
    

    会输出类似usb-XXX-keyboard的路径,然后在代码里指定这个设备:

    import keyboard
    
    # 替换成你找到的键盘设备路径
    keyboard._listener = keyboard.GlobalKeyboardListener(device='/dev/input/by-id/usb-XXX-keyboard')
    
    while True:
        if keyboard.is_pressed('w'):
            print("You press W!")
            break
    

    另外,keyboard库有时候在树莓派上用on_press_key回调会比轮询更可靠,试试这种写法:

    import keyboard
    
    def on_w_press(e):
        print("You press W!")
        keyboard.unhook_all()  # 停止监听
    
    keyboard.on_press_key('w', on_w_press)
    keyboard.wait()  # 保持程序运行
    
  • 针对pygame的调整
    如果你用pygame在无图形界面的环境(比如纯命令行、SSH远程)运行,需要先初始化一个无头窗口,否则pygame无法捕获键盘事件:

    import pygame
    import sys
    
    pygame.init()
    # 创建一个最小化的无框窗口
    screen = pygame.display.set_mode((1, 1), pygame.NOFRAME)
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w:
                    print("You press W!")
                    pygame.quit()
                    sys.exit()
    

    或者在运行脚本前设置环境变量,强制pygame使用帧缓冲设备:

    SDL_VIDEODRIVER=fbcon python3 your_script.py
    
  • 检查Python环境和库的安装
    树莓派上可能同时存在Python2和Python3,确保你安装的keyboardpygame是对应你运行脚本的Python版本:

    • 安装keyboardpip3 install keyboard(针对Python3)
    • 安装pygamesudo apt install python3-pygame(用系统包管理更稳定)

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

火山引擎 最新活动