首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用gpiozero button.when_pressed函数来使用输入和输出整数的函数?

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

Stack Overflow用户
提问于 2017-03-11 14:42:44
回答 3查看 4.4K关注 0票数 1

我试图在树莓派上编程一个按钮,将一个整数加到另一个整数上,这样我就可以通过检查变量mod2是否为0来在while循环中的条件之间来回切换。实际上,我试图通过检查变量是奇数还是偶数来反转while循环中的条件。

我正在尝试使用gpiozero库的when_pressed函数,但它似乎无法调用用于添加和输出整数的函数。

所以,我的代码是:

代码语言:javascript
复制
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循环中切换这两种状态?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-13 11:34:08

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

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

票数 -1
EN

Stack Overflow用户

发布于 2017-06-25 20:29:38

可以将参数传递到gpiozero按钮的“when_pressed”属性中,但是没有很好的文档记录。我找不到任何例子。(请向gpiozero创建者寻求帮助!)

我所做的是将一个lambda函数传递给'when_pressed‘,其中包含我希望该函数访问的变量。

这是你的程序的我的版本:

代码语言:javascript
复制
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‘的函数来触发做其他事情。

票数 5
EN

Stack Overflow用户

发布于 2019-04-22 22:20:20

我更改了lambda-example。我花了很长时间才理解gpiozero纪录片中“强制变量”的含义。另外,我到处用谷歌搜索,对这里的lambda解决方案感到失望。由于我是初学者,比起学习lambda,我更喜欢这个参数传递选项。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42732221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档