2016-07-17 8 views
1

У меня есть светодиод RGB, подключенный к малине Pi 3 с приведенным ниже кодом. Я хочу, чтобы пользователь задал вопрос о выборе красного, зеленого или синего, соответствующего переменной, связанной с конкретными контактами GPIO.Функция lower() не преобразует ввод в нижний регистр в сценарии python 3 для малины Pi

Когда пользователь вводит красный цвет, светодиод станет красным. Когда они войдут в синий цвет, светодиод станет синим.

В настоящее время, если я введи красный цвет, код напечатает '20' (целое число), что соответствует выходу 20 BCM. Это хорошо, но моя проблема в том, что у меня возникли проблемы с преобразованием пользовательского строкового ответа в в нижнем регистре. (т. Е. Конвертировать RED в красный цвет).

Я получаю сообщение об ошибке:

request = input("Choose a color. Red/Green/Blue".lower()) 
File "<string>", line 1, in <module> 
NameError: name 'Red' is not defined 

Приведенный ниже код является в своей простейшей форме в первом тесте, что я могу получить в нижнем регистре, вводимую пользователем.

red = 20 
green = 16 
blue = 21 

try: 
    while True: 
     # I would like to convert user's answer (Red, Green,Blue) to a lowercase answer (ie. red, green blue) 
     request = input("Choose a color. Red/Green/Blue").lower() 

     print(type(request)) 
     print(request) 

except KeyboardInterrupt: 

Любая помощь будет очень признательна.

+2

Вы уверены, что вы используете Python 3? – melpomene

+1

Возможный дубликат ошибки [Python input() - NameError: name '...' не определен] (http://stackoverflow.com/questions/21122540/python-input-error-nameerror-name-is-not-) – zondo

+0

Спасибо ... Насколько я могу сказать, это python 3. Я прочитал статью: [Ошибка ввода Python(): NameError: name '...' не определен] (http://stackoverflow.com/questions/21122540/python-input-error-nameerror-name-is-not-defined), но на самом деле он не отвечает на мой вопрос. Я могу получить аналогичный результат, если я перейду на raw_input («Вопрос здесь»), но потом мне нужно написать дополнительный код. Я надеялся автоматически изменить ввод пользователя на нижний регистр, который затем переводится на значение переменной 16, 20, 21. Надеюсь, это имеет смысл. – theAussieGuy

ответ

2

Это не Python3. 3-дюймовый вход Python вернет вам строку, которую вы можете преобразовать в нижний регистр, но для вашего кода ничего нет в нем, учитывая string с именем цвета, извлеките котрона, связанные с переменной с тем же именем ,

Вход Python 2, с другой стороны, выполняет команду eval, запуская все, что пользователь вводит в качестве выражения Python, перед возвратом результата. Поэтому, когда пользователь вводит red, он предоставит вам соответствующее значение 20. (И нижний вызов этого значения не удался).

Что вам нужно сделать: Напишите код, который будет работать в Python2 или Python3, и, во-вторых, создайте согласованный механизм для получения вашего цвета с учетом введенной пользователем строки. Для этой последней части рекомендуется использовать ассоциированные имена и значения цвета с использованием сопоставления словаря, а не просто как переменные.

Итак:

try: 
    input = raw_input 
except NameError: 
    pass 

colors = dict(
    red = 20, 
    green = 16, 
    blue = 21, 
) 

try: 
    while True: 
     request = input("Choose a color. Red/Green/Blue") 
     color = colors[request.lower()] 
     ... 
    except NameError: 
     print("Invalid color name selected") 
    except KeyboardInterrupt: 
     ... 
+0

Большое спасибо. Это очень легко понять. В «Истинном»; раздел кода, вы написали «color = color [request.lower()] должно быть color = colors [request.lower()]? (с «S») – theAussieGuy

+0

Ошибка ввода - исправлено. Спасибо – jsbueno

+0

фантастический, спасибо :) – theAussieGuy