Установка атрибутов объекта в цикле приводит к тому, что все атрибуты имеют одинаковое значение - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь подключить некоторые кнопки к Raspberry Pi, чтобы они работали по-разному при их нажатии.Я хочу, чтобы каждый из них печатал свое имя и состояние при нажатии или отпускании кнопки.В этом примере я создаю три кнопки и устанавливаю их атрибуты when_pressed и when_released в цикле for:

#!/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.Как ни странно, когда я перезапускаю скрипт, выбирается другое, по-видимому, случайное имя, и все кнопки сообщают, например, land ON или land OFF.

Мне кажется, что создается только одна лямбда-функция для всехобработчики пресса, и один для всех обработчиков выпуска.Как я могу изменить этот скрипт, чтобы печатать правильное имя для каждой кнопки?

1 Ответ

0 голосов
/ 08 июня 2018

Измените свои лямбды на lambda name=name: print(name + ' ON').В вашем случае name привязан к локальному значению name из контекста for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...