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

使用Launchpad.py时,Launchpad X的ButtonStateXY()为何始终返回空值?

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:35:20