如何将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)
关键说明
分离内部与外部逻辑:
- 内部用
_xxx_internal命名的回调处理自身调试打印等基础逻辑,同时遍历触发外部注册的回调函数。 - 外部通过
register_callback方法将自定义方法绑定到指定事件类型(如cross_pressed)。
- 内部用
支持多回调注册:
- 每个事件类型可以注册多个外部方法,触发时会依次执行所有注册的回调。
完善资源管理:
- 添加
stop方法主动终止运行并释放控制器资源。 - 实现
__enter__和__exit__方法,支持with语句自动管理控制器的激活与释放,避免资源泄漏。
- 添加
外部程序使用方式:
- 导入
DS5类后,定义自己的事件处理函数,通过register_callback绑定到对应事件即可。
- 导入
内容的提问来源于stack exchange,提问作者Adam Siwek
相关产品推荐
相关产品推荐

