Цикл My While True застревает в python

Здравствуйте, я работаю над бесконечным циклом While True для основного файла в моем коде Python. Я работаю над Raspberry Pi, и моя цель состоит в том, чтобы всякий раз, когда один из выводов GPIO воспринимал ввод, он печатал строку. Однако, когда я нажимаю кнопку, она будет продолжать печатать ее бесконечно, и единственный способ остановить ее — нажать Ctrl-C. Пока он печатает одну и ту же строку снова и снова, никакая другая кнопка не изменит происходящее. Что я делаю не так, я где-то забыл шаг?

import RPi.GPIO as GPIO
import time
from time import sleep
GPIO.setmode(GPIO.BCM)

GPIO.setup(26, GPIO.IN)
GPIO.setup(19, GPIO.IN)
GPIO.setup(13, GPIO.IN)
GPIO.setup(6, GPIO.IN)

input_A = GPIO.input(26)
input_B = GPIO.input(19)
input_C = GPIO.input(13)
input_D = GPIO.input(6)

while True:
    if input_A == True:
            print('A was pushed')

    if input_B == True:
            print('B was pushed')

    if input_C == True:
            print('C was pushed')

    if input_D == True:
            print('D was pushed')

    sleep(1.5);

person Community    schedule 23.06.2015    source источник
comment
if input_A == True: будет работать, но обычно считается плохим стилем (см., например, PEP 8, второй пункт списка снизу) — предпочитаю просто if input_A:.   -  person lvc    schedule 23.06.2015
comment
Поскольку input_A/B/C/D являются только переменными, их чтение не вызывает вызов функции, он просто считывает те же самые старые исторические значения, когда они были первоначально назначены (вне цикла).   -  person smci    schedule 15.12.2020


Ответы (4)


Вам нужно постоянно обновлять переменные input_* внутри цикла while.

while True:
    input_A = GPIO.input(26)
    input_B = GPIO.input(19)
    input_C = GPIO.input(13)
    input_D = GPIO.input(6)

    if input_A == True:
            print('A was pushed')

    if input_B == True:
            print('B was pushed')

    if input_C == True:
            print('C was pushed')

    if input_D == True:
            print('D was pushed')

    sleep(1.5);
person Peter Gibson    schedule 23.06.2015

В операторе break под каждым оператором if. Пока вы это делаете, измените 2-е и последние ifs на elifs.

while True:
    if input_A == True:
        print('A was pushed')
        break
    elif input_B == True:
        print('B was pushed')
        break
    elif input_C == True:
        print('C was pushed')
        break
    elif input_D == True:
        print('D was pushed')
        break
person Community    schedule 23.06.2015
comment
OP, кажется, хочет бесконечный цикл, но хочет, чтобы он замечал изменения, в которых нажата кнопка. - person lvc; 23.06.2015

Когда вы объявляете

input_A = GPIO.input(26)
input_B = GPIO.input(19)
input_C = GPIO.input(13)
input_D = GPIO.input(6)

вы присваиваете значение тем переменным, которые не изменятся, потому что вы не обновляете их внутри цикла.

Поэтому вам нужно добавить строку в цикл, который обновляет входы A B C и D.

person tomasyany    schedule 23.06.2015

почему бы вам не попробовать ввести перерыв для каждого оператора if. Это должно остановить его от бесконечного цикла.

и обновление ваших переменных, т.е. входные данные должны быть в цикле while.

e.g

if input_A == True:
    print('A was pushed')
    break
person pycod333    schedule 23.06.2015