如何使用 gpiozero button.when_pressed 函数来使用输入和输出整数的函数?

How can I use the gpiozero button.when_pressed function to use a function that inputs and outputs integers?

我正在尝试对 Raspberry Pi 上的按钮进行编程,将一个整数加到另一个整数上,这样我就可以通过检查变量是否在 while 循环中的条件之间来回切换mod2是否为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 循环中切换两种状态?

我意识到 button.when_pressed 函数不能接受任何参数。

为了实现让按钮在 while 循环中的两个不同状态之间切换的最初目标,我最终让按钮在其自己的线程中切换整数符号作为全局变量while 循环,并让全局变量的符号在原始 while 循环中的另一个线程中切换条件。这不是真正正确的方法,但我成功了。

可以将参数传递到 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()

我使用 class 作为原始 'x' 变量的容器。这可能有点矫枉过正,但我​​试图用 x 作为整数来做同样的事情,但它没有用!不太明白为什么。无论如何,class 允许您添加多个变量。

另一点是 'while True' 循环不适用于此方法,因为它占用了所有 CPU 时间。最好使用我调用的函数 'do_something_when_button_is_released' 来触发做其他事情。

我更改了 lambda 示例。 gpiozero的纪录片里的"mandatory variable"的意思,我用了很长时间才看懂。我也到处搜索,对这里的 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()