gpt4 book ai didi

python - 退出定义中的循环

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:05 26 4
gpt4 key购买 nike

我正在使用 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+')
...

之后就只是如上所示的 elifs 直到最后:

  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)在主循环之外。

最佳答案

也许您不需要休息或返回?如果您的 move() 函数具有物理效果,但对程序状态没有影响,则可能不需要返回值。仅当您想要将某些内容传递回调用上下文时(例如,如果您的程序按原样记录位置),才使用 return。但 Python 可以处理只有“副作用”(并且不返回任何内容)的函数。

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

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

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

我没有使用您正在使用的类,但我猜您应该将 Handler 函数的注册 move 移到 While 循环之外:您只需添加一组有关按下键盘对象上的按键时要执行的操作的指令,并且只需执行一次。您的 while(True): 循环可以只检查条件来中断 - 检查传感器条件或特殊键来停止执行。可能有一种更“事件驱动”的编码方式,但我无法提供建议。

关于python - 退出定义中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55818563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com