首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么导致了这段代码中的int不可订阅错误?

是什么导致了这段代码中的int不可订阅错误?
EN

Stack Overflow用户
提问于 2019-10-11 23:39:07
回答 1查看 101关注 0票数 0

我要提前建立我的圣诞村,这样今年我就能对它做些改变了。我试图得到一个LED条和一串LED灯在不同的速度在同一时间褪色。代码工作一分钟,然后给我一个"int not订阅“错误。

我一直在寻找为其他人造成这个错误的例子,但我没有弄清楚为什么我的代码会这样做。

代码语言:javascript
复制
# 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字符串线程运行良好。如果需要的话,我可以提供整个代码。(很抱歉这么长的帖子/大量的代码)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-12 00:07:40

改变这一点:

代码语言:javascript
复制
if ledV[pin] < 0:
    ledV = 0

对此:

代码语言:javascript
复制
if ledV[pin] < 0:
    ledV[pin] = 0

ledV = 0将整个列表设置为0,相反,您希望更改ledV[pin]的值,它只是列表中的一个项。

更新

在将函数传递给Thread类时,不应该调用它,而只需传递函数对象:

代码语言:javascript
复制
LEDThreadr = Thread(target=LEDThread)

如果需要添加参数,可以使用argskwargs

代码语言:javascript
复制
LEDThreadr = Thread(target=LEDThread, args=(1,2,3), kwargs={'key1': 1,'key2': 2}))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58349598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档