2016-01-06 82 views
1

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

buttons = wii.state['buttons'] 

...

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 
     if (buttons & cwiid.BTN_B): 
      keepRunning = False 
    time.sleep(button_delay) 

这里是每斯图尔特的答案固定环

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) 
+0

另外,有没有真正需要检查'你嵌套'if'声明再次buttons',因为这通过第一个“if”保证是真实的。 –

+0

如果我将代码保持原样,并且只需切换keepRunning = False即可中断,但它不起作用,所以程序从不会进入第二个if语句。如果我删除按钮,所以我的第二个如果陈述是if(cwiid.BTN_B):break或keepRunning = False,那么程序将通过循环运行一次(击中所有闪烁),然后终止,而不管B是否被按下 – kalenpw

+0

你确定'cwiid.BTN_B'正确映射到'B'吗? –

回答

1

wii.state['buttons']似乎是一个数字,因此将其存储在变量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)