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

寻求Xbox Series手柄Python开发方案:监听摇杆方向与XYAB按键

解决方案:Python监听Xbox Series手柄输入

针对Xbox Series手柄的摇杆方向与XYAB按键监听需求,以下几个Python方案完全可行:

1. 使用Pygame

Pygame对Xbox系列手柄有良好支持,可能你之前测试时未正确初始化或匹配设备。下面是监听摇杆和按键的示例代码:

import pygame

# 初始化pygame与手柄模块
pygame.init()
pygame.joystick.init()

# 获取第一个连接的Xbox手柄
joystick = pygame.joystick.Joystick(0)
joystick.init()

print(f"已连接手柄: {joystick.get_name()}")

try:
    while True:
        # 遍历事件队列
        for event in pygame.event.get():
            # 摇杆轴移动事件
            if event.type == pygame.JOYAXISMOTION:
                # 左摇杆X轴(0)/Y轴(1),右摇杆X轴(2)/Y轴(3)
                # 轴值范围:-1.0(左/上)到1.0(右/下),可自行设置死区阈值
                if event.axis == 0:
                    if event.value > 0.5:
                        print("左摇杆右移")
                    elif event.value < -0.5:
                        print("左摇杆左移")
                elif event.axis == 1:
                    if event.value > 0.5:
                        print("左摇杆下移")
                    elif event.value < -0.5:
                        print("左摇杆上移")
                # 右摇杆逻辑同理,对应axis=2和axis=3
            # 按键按下事件
            elif event.type == pygame.JOYBUTTONDOWN:
                # XYAB对应按钮编号:A=0, B=1, X=2, Y=3(不同系统可能略有差异,可打印event.button确认)
                btn_map = {0: "A", 1: "B", 2: "X", 3: "Y"}
                if event.button in btn_map:
                    print(f"按键{btn_map[event.button]}按下")

except KeyboardInterrupt:
    # 退出时清理资源
    joystick.quit()
    pygame.quit()

提示:若按钮编号不匹配,可先打印event.button值确认对应关系。

2. 使用inputs模块

inputs是轻量级输入设备监听库,无需复杂配置,直接支持Xbox手柄:

先安装模块:

pip install inputs

示例代码:

from inputs import get_gamepad

try:
    while True:
        events = get_gamepad()
        for event in events:
            # 监听摇杆轴事件
            if event.ev_type == 'Absolute':
                # 左摇杆:ABS_X(0)/ABS_Y(1),右摇杆:ABS_RX(3)/ABS_RY(4)
                # 轴值范围0-65535,中间值32767为中立状态
                if event.code == 'ABS_X':
                    if event.value > 49152:
                        print("左摇杆右移")
                    elif event.value < 16384:
                        print("左摇杆左移")
                elif event.code == 'ABS_Y':
                    if event.value > 49152:
                        print("左摇杆下移")
                    elif event.value < 16384:
                        print("左摇杆上移")
            # 监听XYAB按键事件
            elif event.ev_type == 'Key':
                key_map = {
                    'BTN_SOUTH': 'A',
                    'BTN_EAST': 'B',
                    'BTN_WEST': 'X',
                    'BTN_NORTH': 'Y'
                }
                if event.code in key_map:
                    status = "按下" if event.state == 1 else "松开"
                    print(f"按键{key_map[event.code]}{status}")
except KeyboardInterrupt:
    pass

3. Linux环境下使用evdev

Linux系统可直接通过evdev读取/dev/input下的手柄设备,支持所有USB手柄:

先安装模块:

pip install evdev

示例代码(需root权限运行):

from evdev import InputDevice, categorize, ecodes

# 替换为你的Xbox手柄设备路径,可通过`ls /dev/input/`查看
dev = InputDevice('/dev/input/eventX')

print(f"监听设备: {dev.name}")

try:
    for event in dev.read_loop():
        # 摇杆轴事件
        if event.type == ecodes.EV_ABS:
            absevent = categorize(event)
            axis_name = ecodes.bytype[ecodes.EV_ABS][absevent.event.code]
            if axis_name == 'ABS_X':
                if absevent.event.value > 49152:
                    print("左摇杆右移")
                elif absevent.event.value < 16384:
                    print("左摇杆左移")
            elif axis_name == 'ABS_Y':
                if absevent.event.value > 49152:
                    print("左摇杆下移")
                elif absevent.event.value < 16384:
                    print("左摇杆上移")
        # 按键事件
        elif event.type == ecodes.EV_KEY:
            keyevent = categorize(event)
            key_map = {
                'BTN_SOUTH': 'A',
                'BTN_EAST': 'B',
                'BTN_WEST': 'X',
                'BTN_NORTH': 'Y'
            }
            if keyevent.keycode in key_map:
                status = "按下" if keyevent.keystate == keyevent.key_down else "松开"
                print(f"按键{key_map[keyevent.keycode]}{status}")
except KeyboardInterrupt:
    dev.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:40:17