Button Shim按键触发变量未更新,能否检测LED颜色实现逻辑判断?
嘿,我明白你遇到的麻烦了——按键触发后LED和打印都正常,但变量bE就是没变化,对吧?这其实是Python的作用域问题在搞鬼,咱们一步步来解决:
核心问题:局部变量 vs 全局变量
你在button_e回调函数里直接写bE = 1时,Python会默认把这个bE当成函数内部的局部变量,而不是你之前定义的全局bE。所以你修改的只是函数内部的临时变量,全局的bE根本没被触动。
修复方案:使用global声明
只需要在回调函数里添加global bE,告诉Python你要操作的是全局作用域里的bE变量,代码修改如下:
# 假设你已经在全局定义了check1和bE check1 = 0 bE = 0 while (check1 == 0): if (bE == 0): # 如果按键E还没被按下 if (check() == 1): # 检测到运动的函数 check1 = 1 else: check1 = 1 # 按下E就跳出循环 time.sleep(sleeptime) # 避免频繁检测 @buttonshim.on_press(buttonshim.BUTTON_E) def button_e(button, pressed): global bE # 关键:声明要使用全局变量bE buttonshim.set_pixel(0xff, 0x00, 0x00) # LED变红正常 bE = 1 # 现在修改的是全局的bE了 print("button e pressed") # 打印正常
关于“通过检测LED颜色设置变量”的疑问
理论上是可以读取LED的颜色值(如果Button Shim提供了读取像素的API),但非常不推荐这么做:
- LED是用来做状态反馈的,不是用来存储程序状态的载体,逻辑上本末倒置;
- 如果后续修改了LED的颜色逻辑(比如不同状态用不同颜色),你的检测代码会直接失效;
- 相比直接操作变量,读取LED状态会多一层不必要的开销,还容易引入bug。
所以最好的方式还是通过正确的作用域管理来直接控制bE变量,这样逻辑更清晰也更可靠。
内容的提问来源于stack exchange,提问作者IcePrin34
相关产品推荐
相关产品推荐

