【问题标题】:Python exitting loop with Wiimote button pressPython退出循环与Wiimote按钮按下
【发布时间】:2016-01-06 18:38:33
【问题描述】:

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

  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)

这是每个 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)

【问题讨论】:

  • 另外,没有必要在嵌套的if 语句中再次检查buttons,因为第一个if 保证了这一点。
  • 如果我保持代码不变,只是切换 keepRunning = False 来中断,它不起作用,所以程序永远不会进入第二个 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 是的,我已经在同一个程序中测试过了。

标签: python led wiimote


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多