退出定义中的循环

时间:2019-04-23 19:59:37

标签: python raspberry-pi

我正在使用Raspberry Pi 3B +根据键盘输入来控制某些电机。我正在使用pad4pi库,并设置了定义来处理按键。我应该注意,我是Python的新手。

我尝试在各个位置放置返回和中断,但是它们要么给出语法错误,要么就像我再次按下按钮一样继续操作(实际上就像返回不存在一样)。

我尝试了多种操作,例如:

elif (key=="8"): #-y
    print('y-')
    GPIO.output(yp, False)
    GPIO.output(yn, True)
    time.sleep(.01)
    GPIO.output(yp, False)
    GPIO.output(yn, False)
    return

或:

elif(key=="6"): #+x
    for t in range(5):
        print('x+')
        GPIO.output(xp, True)
        GPIO.output(xn, False)
    GPIO.output(xp, False)
    GPIO.output(xn, False)
    print('exit')
    return

但是return和break似乎返回到if函数之后,第一个显示在打印行中,第二个显示在for行中。

我正在使用命令行进行反馈。对于第二个示例,我期望的是:

x+
x+
x+
x+
x+
exit

但是我得到的是

x+
x+
x+
x+
x+
exit
x+
x+
x+
x+
...

编辑: 这是调用该函数的主要代码:

#main loop
while(True):
    keypad.registerKeyPressHandler(move)

以及它的定义方式:

def move(key):
  if (key=="2"): #+y
    print('y+')
...

在那之后,直到最后为止都是上面的省略号:

  else:
    return
  return

我基本上就是所有相关代码。 请让我知道是否需要更多。 编辑2: 这是一些重新产生问题的代码:

import RPi.GPIO as GPIO
from pad4pi import rpi_gpio
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
import time
from time import sleep

#y control
yp = 24;
yn = 26;
GPIO.setup(yp, GPIO.OUT) #+y
GPIO.setup(yn, GPIO.OUT) #-y

#keypad inputs
KEYPAD = [
        ["1","2","3","A"],
        ["4","5","6","B"],
        ["7","8","9","C"],
        ["*","0","#","D"]
]

COL_PINS = [31, 33, 35, 37]
ROW_PINS = [32, 36, 38, 40]
factory = rpi_gpio.KeypadFactory()
factory.create_4_by_4_keypad
keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS)

def move(key):
  if (key=="8"): #-y
    print('y-')
    GPIO.output(yp, False)
    GPIO.output(yn, True)
    time.sleep(.01)
    GPIO.output(yp, False)
    GPIO.output(yn, False)
    return
  else:
    return

#main loop
while(True):
    keypad.registerKeyPressHandler(move)
#cleanup:
keypad.cleanup()
GPIO.cleanup()

编辑3: 我收到的错误消息大都可以归因于我对python的经验不足。例如:

  if (key=="8"): #-y
    print('y-')
    GPIO.output(yp, False)
    GPIO.output(yn, True)
    time.sleep(.01)
    GPIO.output(yp, False)
    GPIO.output(yn, False)
    break
  else:
    return

给予:

> %Run recreate.py
Traceback (most recent call last):
  File "/home/pi/Desktop/python/recreate.py", line 36
    break
    ^
SyntaxError: 'break' outside loop

我尝试过的唯一没有出现此错误的位置是:

    elif(key=="6"): #+x
        for t in range(5):
            print('x+')
            GPIO.output(xp, True)
            GPIO.output(xn, False)
            break
        GPIO.output(xp, False)
        GPIO.output(xn, False)
        print('exit')
        return

返回:

x+
exit
x+
exit
x+
exit
x+
exit
x+
...

编辑: 找到了解决方法! 移动 keypad.registerKeyPressHandler(move) 在主循环之外。

1 个答案:

答案 0 :(得分:0)

也许您不需要休息或退货?如果您的move()函数具有物理作用,但对程序状态没有影响,则可能无需返回值。仅当您要将某些内容传递回调用上下文时才使用return(例如,如果程序记录了它的运行位置)。但是Python可以使用仅具有“副作用”(而没有return的功能)的函数。

您的if, elif, elif, else:该序列将在每次按键时执行一次,只有匹配的按键动作才会发生,然后在下一次按键时再次调用move()。

break会跳出循环并跳转到下一条可执行指令。

您可能一直在寻找Python关键字continue,该关键字可让您将控制发送回循环的开头,但是我认为当所有内容都在if/elif/elif块中时,您不需要它

我没有使用过您正在使用的类,但是我想您应该将Handler函数move的注册移到While循环之外:您只是添加了一个集合关于将按键按下到键盘对象上时的操作的说明,您只需执行一次。您的while(True):循环可以只检查break的条件-检查传感器条件或特殊键以停止执行。可能有一种更“事件驱动”的编码方式,但是我对此不提建议。