我试图在Raspberry Pi上编写一个按钮,将一个整数添加到另一个整数,这样我就可以在while
循环中的条件之间来回切换,检查变量mod 2是否为0或不。我本质上是试图通过检查变量是奇数还是偶数来翻转while
循环中的条件。
我尝试使用gpiozero
库when_pressed
函数,但它似乎无法调用添加和输出整数的函数。
所以,我的代码是:
from gpiozero import Button
btn = Button(17) #the button is wired to GPIO pin 17
def addSurf(a):
a = a + 1
return(a)
x = 0
btn.when_pressed = addSurf(x)
while True:
if x == 0:
#do some stuff
else:
#do some other stuff
为什么我尝试运行此功能,我得到TypeError: unsupported operand type(s) for +: 'Button' and 'int'
。
如何使用btn.when_pressed
函数来使用输入和输出整数的函数?
或者,是否有其他[更好?]方法使按钮切换while
循环中的两个状态?
答案 0 :(得分:4)
可以将参数传递给gpiozero按钮'when_pressed'属性,但它没有很好地记录。我找不到任何例子。 (提示给gpiozero创作者寻求帮助!)
我所做的是将lambda函数传递给'when_pressed',其中包含我希望函数访问的变量。
这是我的程序版本:
from gpiozero import Button
from signal import pause
btn = Button(17) #the button is wired to GPIO pin 17
class X():
value = 0
def addSurf(x):
x.value += 1
print('Adding 1')
def do_something_when_button_is_released(x):
print('x = ',x.value)
x = X()
btn.when_pressed = lambda : addSurf(x)
btn.when_released = lambda : do_something_when_button_is_released(x)
pause()
我使用了一个类作为原始'x'变量的容器。这可能是矫枉过正,但我尝试用x作为整数做同样的事情,但它不起作用!真的不明白为什么。无论如何,一个类允许你添加多个变量。
另一点是'while True'循环不适用于此方法,因为它占用了所有CPU时间。最好使用我称之为'do_something_when_button_is_released'的函数来触发其他内容。
答案 1 :(得分:0)
我更改了lambda示例。我花了很长时间才了解gpiozero纪录片中“强制变量”的含义。我也到处搜寻Google,对这里的lambda解决方案感到失望。因为我是初学者,所以比起学习lambda,我更喜欢使用此选项进行参数传递。
from gpiozero import Button
from signal import pause
class X():
value = 0
def addSurf(obtained_but):
obtained_but.x.value += 1
print('Adding 1')
def do_something_when_button_is_released(obtained_but):
print('x = ',obtained_but.x.value)
#attach the x to the class Button before initializing it
Button.x = X()
btn = Button(24) #my button is wired to GPIO pin 24
btn.when_pressed = addSurf
btn.when_released = do_something_when_button_is_released
pause()
答案 2 :(得分:-1)
我意识到button.when_pressed
函数不能接受任何参数。
为了实现我的原始目标,让按钮在while
循环中的两个不同状态之间切换,我最终让按钮在一个{{{}的自己的线程中切换整数的符号作为全局变量。 1}}循环,并使用全局变量的符号切换原始while
循环中另一个线程中的条件。这不是一个真正适当的方法,但我让它运作。