2016-07-17 7 views
2

У меня есть малиновый Pi 3, и я пишу код с помощью Python 3. Я добавил запрос в свой код, чтобы попросить пользователя ввести три номера, которые указывают если R, G или B включены или выключены (0 = выключено и 1 = включено). Например, 101 означает, что R = on, B = off и G = on.Ошибка во время запроса целых чисел, связанных с RGB LED на Raspberry Pi

Я же получаю сообщение об ошибке, что я думаю, что это связано с версией Python, который я использую (Python 3):

TypeError: object of type 'int' has no len()

Я был следующий учебник YouTube здесь: Controlling a RGB LED with a raspberry pi

import time 
import RPi.GPIO as GPIO 

R = 16 
G = 20 
B = 21 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(R,GPIO.OUT) 
GPIO.setup(G,GPIO.OUT) 
GPIO.setup(B,GPIO.OUT) 
GPIO.output(R,GPIO.HIGH) 
GPIO.output(G,GPIO.HIGH) 
GPIO.output(B,GPIO.HIGH) 

def clearCh(): 
    GPIO.cleanup(R) 
    GPIO.cleanup(G) 
    GPIO.cleanup(B) 

try: 
    while True: 
     request = input("RGB-->") 
     if (len(request) == 3): 
      GPIO.output(R, int(request[0])) 
      GPIO.output(G, int(request[1])) 
      GPIO.output(B, int(request[2])) 

except KeyboardInterrupt: 
clearCh() 

Любые советы, указывающие на меня в правильном направлении, будут высоко оценены.

Обратите внимание, я также попробовал следующее: if (len(str(request)) == 3): который дал следующую ошибку:

TypeError: 'int' object has no attribute '__getitem__'

ответ

2

TypeError: object of type 'int' has no len()

кажется input возвращаемых данных, который является целым числом (тип данных), такие как 101 что вы ввели. Вы можете попробовать преобразовать данные, возвращаемые input, в строку (другой тип данных), но вам нужно сохранить ее в этом формате для ее индексации. Выполнение len(str(request)) только преобразует данные в request в строку для этой строки кода, это не влияет на объект request.

try: 
    while True: 
     request = input("RGB-->") 
     request = str(request) 
     if (len(request) == 3): 
      GPIO.output(R, int(request[0])) 
      GPIO.output(G, int(request[1])) 
      GPIO.output(B, int(request[2])) 

Если у вас есть request как тип данных строки, равной 101 затем request[0] указывает на самый левый 1, request[1] указывает на 0, и так далее. Наконец, int() преобразует эти числовые строки в целочисленные типы данных.

Кроме того, не забудьте отступом строки кода под блоком if.


Наконец, хороший способ, чтобы проверить, какой тип данных вы работаете, используя команду type(). В качестве эксперимента (или как «проверки здравомыслия») вы можете добавить type(request) в свой код до и после преобразования его в строку.

+1

Спасибо Гэри. В этом есть смысл. Спасибо, что нашли время ответить. Он работал после внесения этих изменений. – theAussieGuy

-1

Это кажется, что питон встроенные функции len() не работает для целых чисел. Так что вы можете захотеть сделать, чтобы убедиться, что это строка перед измерением длины.

try: 
    while True: 
     request = str(input("RGB-->")) 
     if (len(request) == 3): 
     GPIO.output(R, int(request[0])) 
     GPIO.output(G, int(request[1])) 
     GPIO.output(B, int(request[2])) 

except KeyboardInterrupt: 
clearCh() 
+0

Спасибо. Я попытался сделать это на основе другой статьи о переполнении стека, но затем я получаю еще одну ошибку: ** TypeError: объект 'int' не имеет атрибута '__getitem __' ** – theAussieGuy

+0

Когда вы извлекаете значения, например 'int (request [0]), ', вы ожидаете, что' request' будет строкой, но ее все еще целое число, а целые числа не могут быть доступны в виде списков. Я отредактировал свой ответ, чтобы сразу преобразовать в строку. –