是什么导致此代码中的 int not subscriptable 错误?
What is causing the int not subscriptable error in this code?
我正在提前设置我的圣诞村,以便今年可以对其进行更改。我正在尝试让一个 LED 灯条和一串 LED 灯同时以不同的速度褪色。代码工作了一分钟然后给我一个 "int not subscriptable" 错误。
我一直在查看导致其他人出现此错误的示例,但我不明白为什么我的代码会这样。
# imports
import RPi.GPIO as GPIO
import time
from threading import Thread
import random
# global values
GPIO.setmode(GPIO.BOARD)
led = [31, 37, 35, 33]
village = [36, 38, 40]
# generate array for led brightness
ledV = [0, 0, 0, 100]
ledFV = [random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), 0]
ledDelay = [0.03, 0.4, 0.2, 0]
# always gives GPIO in use even when not this mutes that
GPIO.setwarnings(False)
tmpLoop = 10
def setup():
# using GPIO.BOARD makes it so you can
# count the pins and use that number
# 1-2
# 3-4 etc...
# set led pins to output
GPIO.setup(led[0], GPIO.OUT)
GPIO.setup(led[1], GPIO.OUT)
GPIO.setup(led[2], GPIO.OUT)
GPIO.setup(led[3], GPIO.OUT)
# setup PWM for fading on any pin
led[0] = GPIO.PWM(31, 100)
led[1] = GPIO.PWM(37, 100)
led[2] = GPIO.PWM(35, 100)
led[0].start(0)
led[1].start(0)
led[2].start(0)
# turn on LEDstrip
GPIO.output(led[3], 255)
def ledFader(pin, value):
global ledV
if ledV[pin] < value:
while (ledV[pin] < value):
# This is the spot that it says is causing the error
ledV[pin] = ledV[pin] + ledFV[pin]
if ledV[pin] > 100:
ledV[pin] = 100
led[pin].ChangeDutyCycle(ledV[pin])
time.sleep(ledDelay[pin])
if ledV[pin] > value:
while (ledV[pin] > value):
ledV[pin] = ledV[pin] - ledFV[pin]
if ledV[pin] < 0:
ledV = 0
led[pin].ChangeDutyCycle(ledV[pin])
time.sleep(ledDelay[pin])
def LEDThread():
while True:
ledFader(1, 100) # no green
ledFader(2, 100) # no red
ledFader(1, 0) # green on
ledFader(0, 100) # no blue
ledFader(2, 0) # red on
ledFader(1, 100) # no green
ledFader(0, 0) # blue on
ledFader(1, 0) # green on
GPIO.cleanup()
setup()
LEDThreadr = Thread(target=LEDThread())
LEDThreadr.start()
据我所知,应该没有任何问题。这是文件的一半。另一半几乎相同,但设置用于村庄的 LED 灯。那部分不会出错。 (运行 两个线程分别在终端和 LED 串线程工作正常。
如果需要,我可以提供整个代码。 (抱歉,代码太长 post/lots)
改变这个:
if ledV[pin] < 0:
ledV = 0
对此:
if ledV[pin] < 0:
ledV[pin] = 0
行 ledV = 0
将整个列表设置为 0,而您想更改 ledV[pin]
的值,它只是列表中的一个项目。
更新
在将函数传递给 Thread
class 时,您不应该 调用 函数,而是简单地传递函数对象:
LEDThreadr = Thread(target=LEDThread)
如果需要加参数,可以使用args
或kwargs
:
LEDThreadr = Thread(target=LEDThread, args=(1,2,3), kwargs={'key1': 1,'key2': 2}))
我正在提前设置我的圣诞村,以便今年可以对其进行更改。我正在尝试让一个 LED 灯条和一串 LED 灯同时以不同的速度褪色。代码工作了一分钟然后给我一个 "int not subscriptable" 错误。
我一直在查看导致其他人出现此错误的示例,但我不明白为什么我的代码会这样。
# imports
import RPi.GPIO as GPIO
import time
from threading import Thread
import random
# global values
GPIO.setmode(GPIO.BOARD)
led = [31, 37, 35, 33]
village = [36, 38, 40]
# generate array for led brightness
ledV = [0, 0, 0, 100]
ledFV = [random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), 0]
ledDelay = [0.03, 0.4, 0.2, 0]
# always gives GPIO in use even when not this mutes that
GPIO.setwarnings(False)
tmpLoop = 10
def setup():
# using GPIO.BOARD makes it so you can
# count the pins and use that number
# 1-2
# 3-4 etc...
# set led pins to output
GPIO.setup(led[0], GPIO.OUT)
GPIO.setup(led[1], GPIO.OUT)
GPIO.setup(led[2], GPIO.OUT)
GPIO.setup(led[3], GPIO.OUT)
# setup PWM for fading on any pin
led[0] = GPIO.PWM(31, 100)
led[1] = GPIO.PWM(37, 100)
led[2] = GPIO.PWM(35, 100)
led[0].start(0)
led[1].start(0)
led[2].start(0)
# turn on LEDstrip
GPIO.output(led[3], 255)
def ledFader(pin, value):
global ledV
if ledV[pin] < value:
while (ledV[pin] < value):
# This is the spot that it says is causing the error
ledV[pin] = ledV[pin] + ledFV[pin]
if ledV[pin] > 100:
ledV[pin] = 100
led[pin].ChangeDutyCycle(ledV[pin])
time.sleep(ledDelay[pin])
if ledV[pin] > value:
while (ledV[pin] > value):
ledV[pin] = ledV[pin] - ledFV[pin]
if ledV[pin] < 0:
ledV = 0
led[pin].ChangeDutyCycle(ledV[pin])
time.sleep(ledDelay[pin])
def LEDThread():
while True:
ledFader(1, 100) # no green
ledFader(2, 100) # no red
ledFader(1, 0) # green on
ledFader(0, 100) # no blue
ledFader(2, 0) # red on
ledFader(1, 100) # no green
ledFader(0, 0) # blue on
ledFader(1, 0) # green on
GPIO.cleanup()
setup()
LEDThreadr = Thread(target=LEDThread())
LEDThreadr.start()
据我所知,应该没有任何问题。这是文件的一半。另一半几乎相同,但设置用于村庄的 LED 灯。那部分不会出错。 (运行 两个线程分别在终端和 LED 串线程工作正常。 如果需要,我可以提供整个代码。 (抱歉,代码太长 post/lots)
改变这个:
if ledV[pin] < 0:
ledV = 0
对此:
if ledV[pin] < 0:
ledV[pin] = 0
行 ledV = 0
将整个列表设置为 0,而您想更改 ledV[pin]
的值,它只是列表中的一个项目。
更新
在将函数传递给 Thread
class 时,您不应该 调用 函数,而是简单地传递函数对象:
LEDThreadr = Thread(target=LEDThread)
如果需要加参数,可以使用args
或kwargs
:
LEDThreadr = Thread(target=LEDThread, args=(1,2,3), kwargs={'key1': 1,'key2': 2}))