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

如何将PS5 DualSense控制器事件传递到外部Python程序?

实现PS5 DualSense控制器事件向外部程序传递的方案

要让控制器事件能触发外部程序的自定义方法,核心是让你的DS5类支持外部回调注册,而非将事件处理逻辑硬编码在类内部。以下是基于你现有代码的改造方案:

修改后的代码示例

from time import sleep
from dualsense_controller import DualSenseController

class DS5:
    def __init__(self, controller_nb=0, debug=False):
        device_infos = DualSenseController.enumerate_devices()
        if len(device_infos) < 1:
            raise Exception('No DualSense Controller available.')

        self.is_running = True
        self.debug = debug
        # 存储外部注册的回调函数,键为事件类型,值为回调列表
        self.external_callbacks = {
            "cross_pressed": [],
            "cross_released": [],
            "error": []
        }

        self.controller = DualSenseController(device_index_or_device_info=device_infos[controller_nb])
        self.register_internal_callbacks()
        self.controller.activate()

    def register_internal_callbacks(self):
        # 绑定内部回调,在内部回调中触发外部注册的方法
        self.controller.btn_cross.on_down(self._on_cross_pressed_internal)
        self.controller.btn_cross.on_up(self._on_cross_released_internal)
        self.controller.on_error(self._on_error_internal)

    # 内部回调:处理自身逻辑 + 触发外部回调
    def _on_cross_pressed_internal(self):
        if self.debug:
            print('cross button pressed')
        # 触发所有注册的外部回调
        for callback in self.external_callbacks["cross_pressed"]:
            callback()

    def _on_cross_released_internal(self):
        if self.debug:
            print('cross button released')
        for callback in self.external_callbacks["cross_released"]:
            callback()

    def _on_error_internal(self, error):
        if self.debug:
            print(f"Controller error: {error}")
        for callback in self.external_callbacks["error"]:
            callback(error)

    # 供外部程序注册回调的方法
    def register_callback(self, event_type, callback):
        if event_type not in self.external_callbacks:
            raise ValueError(f"Unsupported event type: {event_type}")
        if callable(callback):
            self.external_callbacks[event_type].append(callback)

    def stop(self):
        self.is_running = False
        self.controller.deactivate()

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.stop()

if __name__ == "__main__":
    # 外部程序示例:定义自己的事件处理方法
    def my_cross_press_action():
        print("外部程序:十字键被按下,执行自定义逻辑")

    def my_cross_release_action():
        print("外部程序:十字键被释放,执行自定义逻辑")

    def my_error_handler(error):
        print(f"外部程序:捕获到控制器错误 - {error}")

    # 使用DS5控制器并注册外部回调
    with DS5(debug=True) as ds5:
        ds5.register_callback("cross_pressed", my_cross_press_action)
        ds5.register_callback("cross_released", my_cross_release_action)
        ds5.register_callback("error", my_error_handler)

        while ds5.is_running:
            sleep(0.001)

关键说明

  1. 分离内部与外部逻辑:

    • 内部用_xxx_internal命名的回调处理自身调试打印等基础逻辑,同时遍历触发外部注册的回调函数。
    • 外部通过register_callback方法将自定义方法绑定到指定事件类型(如cross_pressed)。
  2. 支持多回调注册:

    • 每个事件类型可以注册多个外部方法,触发时会依次执行所有注册的回调。
  3. 完善资源管理:

    • 添加stop方法主动终止运行并释放控制器资源。
    • 实现__enter__和__exit__方法,支持with语句自动管理控制器的激活与释放,避免资源泄漏。
  4. 外部程序使用方式:

    • 导入DS5类后,定义自己的事件处理函数,通过register_callback绑定到对应事件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:34:59