我正在尝试将一些按钮连接到 Raspberry Pi,以便在按下它们时有不同的行为。我希望他们每个人在按下或释放按钮时打印出他们的名字和状态。在此示例中,我实例化了三个按钮,并在 for 循环中设置它们的 when_pressed
和 when_released
属性:
#!/usr/bin/env python3
from gpiozero import LED, Button
from signal import pause
buttons = {
"bcn": Button(2),
"land": Button(3),
"taxi": Button(4)
}
for name, btn in buttons.items():
btn.when_pressed = lambda: print(name + ' ON')
btn.when_released = lambda: print(name + ' OFF')
print('ready')
pause()
但是,当我按下按钮时,它们会报告正确的状态,但它们都报告相同的名称。例如,所有按钮都可能报告 bcn ON
或 bcn OFF
。奇怪的是,当我重新启动脚本时,会选择另一个看似随机的名称,并且所有按钮都会报告例如着陆
或着陆
。
在我看来,它只是为所有按下处理程序创建一个 lambda 函数,并为所有发布处理程序创建一个 lambda 函数。如何修改此脚本以打印每个按钮的正确名称?
最佳答案
将 lambda 表达式更改为 lambda name=name: print(name + ' ON')
。在您的情况下,name
绑定(bind)到 for
上下文中的本地 name
值。
关于python - 在循环中设置对象属性会导致所有属性具有相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50760338/