我试图在树莓派上编程一个按钮,将一个整数加到另一个整数上,这样我就可以通过检查变量mod2是否为0来在while循环中的条件之间来回切换。实际上,我试图通过检查变量是奇数还是偶数来反转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循环中切换这两种状态?
发布于 2017-03-13 11:34:08
我意识到button.when_pressed函数不能接受任何参数。
为了实现我最初的目标,即让按钮在while循环中的两个不同状态之间切换,我最终在while循环中让按钮在自己的线程中切换整数的符号作为全局变量,并让全局变量的符号在原始while循环中的另一个线程中切换条件。这并不是一个正确的方法,但我让它工作了。
发布于 2017-06-25 20:29:38
可以将参数传递到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‘的函数来触发做其他事情。
发布于 2019-04-22 22:20:20
我更改了lambda-example。我花了很长时间才理解gpiozero纪录片中“强制变量”的含义。另外,我到处用谷歌搜索,对这里的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()https://stackoverflow.com/questions/42732221
复制相似问题