如何使用 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()
我正在尝试对 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()