2016-01-06 3 views
1

Я пишу скрипт python, который будет управлять светодиодами с Wiimote, используя библиотеку cwiid. Программа распознает 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

Кроме того, нет никакой необходимости проверять 'снова buttons' в вашем вложенной' if' заявление, так как это гарантируется, что это будет верно с помощью первого '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'] каждый раз.

Вы можете рассмотреть вопрос о проверке нажата ли B после каждого blink, как это:

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) 
Смежные вопросы