使用Launchpad.py时,Launchpad X的ButtonStateXY()为何始终返回空值?
核心原因与修复方案
1. 先刷新输入缓冲区再读取状态
ButtonStateXY()的返回值依赖设备输入缓冲区的实时更新,你的循环中可能因为灯光处理、节拍计算等操作,导致输入事件没有被及时捕获。在读取按钮状态前调用ButtonRawRead()刷新缓冲区即可解决:
while going: # 先刷新输入缓冲区,确保按钮状态更新 lp.ButtonRawRead() button = lp.ButtonStateXY() print(button) curbeat = (time.perf_counter() - startTime)*16/SpB curlight = [x for x in lightmap if x[1] <= curbeat] curnotes = [x for x in notemap if x[2] <= curbeat+7] for lights in curlight: lp.LedCtrlXY(lights[0][0], lights[0][1], lights[0][2], lights[0][3], lights[0][4]) # 改用列表推导式删除元素,避免遍历中修改原列表引发异常 lightmap = [x for x in lightmap if x[1] > curbeat]
2. 确认按钮模式配置正确
不同Launchpad型号需要匹配对应的按钮模式,初始化时设置正确的模式才能让ButtonStateXY()正常工作:
# 初始化示例,根据你的设备调整模式值(常见为0或1) lp = launchpad.Launchpad() lp.Open() lp.ButtonMode(1)
3. 修复列表遍历的潜在阻塞
你原代码中直接在遍历curlight时删除lightmap的元素,会导致列表结构异常,可能阻塞循环进而影响按钮状态读取。改用列表推导式生成新的lightmap是更安全的做法,如上面代码所示。
4. 用最小代码验证功能
如果上述调整无效,先运行以下最小测试代码,确认ButtonStateXY()本身是否正常:
import launchpad import time lp = launchpad.Launchpad() lp.Open() lp.ButtonMode(1) try: while True: lp.ButtonRawRead() print(lp.ButtonStateXY()) time.sleep(0.01) finally: lp.Close()
如果这段代码能正常输出按下的按钮坐标,说明问题出在你原代码的其他逻辑阻塞了输入读取。
内容的提问来源于stack exchange,提问作者Beans
相关产品推荐
相关产品推荐

