如何在Pygame中获取DualShock 4控制器的电量?
获取DualShock 4控制器电量的解决方案
Pygame的get_power_level()方法仅支持部分控制器,DualShock 4(DS4)不在其适配范围内——这是因为SDL(Pygame依赖的底层库)未针对DS4的自定义HID报告做电量解析。以下是几种可行的替代方案:
1. 直接通过HID接口读取(跨平台)
DS4会通过HID报告主动发送电量数据,你可以使用hidapi库直接读取设备的HID数据包并解析电量:
首先安装依赖:
pip install hidapi
然后使用以下代码读取电量:
import hid # DS4的标准VID和PID(无线/有线模式通用) DS4_VID = 0x054C DS4_PID = 0x09CC try: # 连接DS4设备 ds4_device = hid.Device(vid=DS4_VID, pid=DS4_PID) # 读取64字节的输入报告(DS4的标准报告长度) report = ds4_device.read(64) if report: # 电量值位于报告的第31个字节(索引为30),范围0-100 battery_level = report[30] print(f"DS4电量: {battery_level}%") ds4_device.close() except Exception as e: print(f"读取失败: {str(e)}")
注意:部分系统可能需要权限才能访问HID设备,比如Linux下需要添加udev规则,Windows下可能需要管理员权限。
2. 系统层面读取(针对特定平台)
Linux
DS4连接后会在/sys/class/power_supply/目录下生成电量文件,直接读取即可:
import glob def get_ds4_battery(): battery_paths = glob.glob('/sys/class/power_supply/sony_controller_battery_*/capacity') if battery_paths: with open(battery_paths[0], 'r') as f: return f.read().strip() return None battery = get_ds4_battery() print(f"DS4电量: {battery}%" if battery else "未检测到DS4控制器")
Windows
可以通过WMI接口读取设备电量,需要安装pywin32库:
pip install pywin32
示例代码:
import win32com.client def get_ds4_battery(): wmi = win32com.client.GetObject("winmgmts:") # 筛选DS4的电源设备 for device in wmi.InstancesOf("Win32_Battery"): if "DualShock 4" in device.Description: return device.EstimatedChargeRemaining return None battery = get_ds4_battery() print(f"DS4电量: {battery}%" if battery else "未检测到DS4控制器")
macOS
可以使用pyobjc调用系统IOKit框架读取设备信息,安装依赖:
pip install pyobjc
示例代码(核心逻辑):
from Foundation import NSBundle from IOKit.hid import IO_HIDManagerCreate, IO_HIDManagerSetDeviceMatching, IO_HIDManagerOpen, IO_HIDManagerCopyDevices def get_ds4_battery(): hid_manager = IO_HIDManagerCreate(None) # 匹配DS4设备 matching_dict = {"idVendor": 0x054C, "idProduct": 0x09CC} IO_HIDManagerSetDeviceMatching(hid_manager, matching_dict) IO_HIDManagerOpen(hid_manager, 0) devices = IO_HIDManagerCopyDevices(hid_manager) if devices.count() > 0: # 读取HID报告并解析第30字节获取电量(逻辑同跨平台HID方法) report = devices[0].read(64) battery_level = report[30] print(f"DS4电量: {battery_level}%") return None get_ds4_battery()
3. 专用DS4驱动库
使用ds4drv(专门针对DS4的驱动工具),它能提供完整的设备状态信息,包括电量:
安装依赖:
pip install ds4drv
运行ds4drv服务后,可以通过其日志输出解析电量,或者使用其Python API直接获取状态(需参考官方文档)。注意Linux下可能需要root权限或配置udev规则来运行ds4drv。
关于inputs库的报错问题:该库对DS4的识别依赖于系统驱动和权限配置,通常需要安装DS4专用驱动(如Windows下的DS4Windows)或调整系统权限才能正常识别。
内容的提问来源于stack exchange,提问作者FrostDream
相关产品推荐
相关产品推荐

