用Wiimote按钮按下Python退出循环

用Wiimote按钮按下Python退出循环,python,led,wiimote,Python,Led,Wiimote,我正在编写一个python脚本,它将使用cwiid库通过Wiimote控制LED。该程序识别wiimote并能够启动循环,但当用户按下遥控器上的“B”时,它不会让我停止循环。下面是相关代码,如果需要,我可以提供脚本的其余部分。谢谢 buttons = wii.state['buttons'] 这是Stuart回答的固定循环 if (buttons & cwiid.BTN_A): print 'Button A pressed' print 'Press B t

我正在编写一个python脚本,它将使用cwiid库通过Wiimote控制LED。该程序识别wiimote并能够启动循环,但当用户按下遥控器上的“B”时,它不会让我停止循环。下面是相关代码,如果需要,我可以提供脚本的其余部分。谢谢

  buttons = wii.state['buttons']

这是Stuart回答的固定循环

  if (buttons & cwiid.BTN_A):
    print 'Button A pressed'
    print 'Press B to cancel loop'
    keepRunning = True
    while keepRunning:
        blink(32)#5v green
        blink(38)#5v yellow
        blink(36)#5v blue
        blink(40)#5v red
        blink(37)#3v3 green
        blink(35)#3v3 yellow
        blink(33)#3v3 blue
        blink(31)#3v3 red
        buttons = wii.state['buttons']#added in this line
        if (buttons & cwiid.BTN_B):
            keepRunning  = False
    time.sleep(button_delay)

wii.state['buttons']
似乎是一个数字,因此将其存储在变量
buttons
中意味着当用户按下不同的按钮组合时,它不再更新

要解决这个问题,只需每次直接引用wii.state['buttons']来替换
按钮

您可能想考虑是否在每个代码< BLink >之后按下B,像这样:

from itertools import cycle
...
if wii.state['buttons'] & cwiid.BTN_A:
    print 'Button A pressed'
    print 'Press B to cancel loop'
    for colour in cycle([32, 38, 36, 40, 37, 35, 33, 31]):
        blink(colour)
        if wii.state['buttons'] & cwiid.BTN_B:
            break
    time.sleep(button_delay)

另外,在嵌套的
if
语句中,实际上不需要再次检查
按钮,因为第一个
if
语句保证这是真的。如果我保持代码原样,只需将keepRunning=False切换为break,它就不起作用,因此程序永远不会进入第二个if语句。如果我删除按钮,那么我的第二个If语句是If(cwiid.BTN_B):break或keepRunning=False,那么程序将在循环中运行一次(点击所有闪烁)然后终止,无论是否按下B键。是否确定
cwiid.BTN_B
已正确映射到
B
?不知道库,但可能需要检查
wii.state['buttons']&cwiid.BTN_B
,而不是将
wii.state['buttons']的值存储在变量中,当用户按下不同的按钮时,它不会改变。@N.Wouda是的,我已经在同一个程序中测试过了。
from itertools import cycle
...
if wii.state['buttons'] & cwiid.BTN_A:
    print 'Button A pressed'
    print 'Press B to cancel loop'
    for colour in cycle([32, 38, 36, 40, 37, 35, 33, 31]):
        blink(colour)
        if wii.state['buttons'] & cwiid.BTN_B:
            break
    time.sleep(button_delay)