选择for循环中的第一个第n个列表项

时间:2016-05-13 13:15:30

标签: python opc fadecandy

我现在所拥有的是下面的循环,它依次点亮24个链上的每一个。

while True:
    for i in range(24):
        pixels = [ (0,0,0) ] * numLEDs
        pixels[i] = (100, 100, 100)
        client.put_pixels(pixels)
        time.sleep(0.02) 

我希望拥有的是先前点亮的LED每次迭代都会保持不变。因此,点亮的LED的数量每次增加一个。

我假设我可以从列表的开头到第i个项目进行选择,如下所示。 但是这会返回一个" TypeError:' int'对象不可迭代"。

我不清楚为什么这不起作用。

while True:
    for i in range(24):
        pixels = [ (0,0,0) ] * numLEDs
        pixels[:i] = (100, 100, 100)
        client.put_pixels(pixels)
        time.sleep(0.02) 

虽然我已经引起了你的注意,除了使用time.sleep()之外,还有更好的方法来计算这些循环吗?虽然我正在使用线程,但是当led模式发生变化时,睡眠仍会导致一些延迟。

4 个答案:

答案 0 :(得分:2)

问题是你永远用全零覆盖你当前的像素状态。如果您在无限while循环之外定义像素结构,然后一次只调整一个,它应该可以解决您的问题。尝试这样的事情:

numLEDs = 24
pixels = [ (0,0,0) ] * numLEDs

while True:
    for i in range(numLEDs):
        pixels[i] = (100, 100, 100)
        client.put_pixels(pixels)
        time.sleep(0.02)

答案 1 :(得分:0)

在第一个示例中,循环通过将LED设置为(0,0,0)来关闭LED。相反,为什么不使用它:

while True:
    for i in range(24):
        pixels = [ (100,100,100) ] * (i) + [ (0,0,0) ] * (numLEDs - i)
        client.put_pixels(pixels)
        time.sleep(0.02) 

这会将列表的第一个i元素设置为(100,100,100),然后将剩余的元素设置为(0,0,0)。

如果i = 5且numLEDs = 15,您将获得此输出:

[(100, 100, 100), (100, 100, 100), (100, 100, 100), (100, 100, 100), (100, 100, 100), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]

正如你所看到的,这会留下其他人。

答案 2 :(得分:0)

这是一个处理两个连续LED总是打开的任务的答案,因此,如果你将你的LED阵列安装成圆形,你会看到一个双光在圆圈上移动频率约为2 Hz 我回答了对OP有效问题的错误印象,我已经给出了另一个解决真实问题的答案,但我想留下这个答案,因为它有它的美丽,至少在旁观者的眼中。

您希望使用简单的模块算法计算哪个LED必须关闭,哪个LED必须打开,使用技巧(我希望在您的要求下允许),我们从部分亮起的电路板开始。

# constants
ON = (100, 100, 100)
OFF = (0, 0, 0)
N = 24

# initial state of the leds
px = [ OFF ] * N
client.put_pixels(px) # no leds on

# set initial conditions for the iteration
px[0] = ON
n = -1

# the never-ending loop
while True:
    n +=1
    i, j = (n-1)%N, (n+1)%N
    px[i], px[j] = OFF, ON
    client.put_pixels(px)
    time.sleep(0.02)

在第一次迭代之前,你已经在px列表中将0引导,在第一次迭代之后你有2个LED开启,在所有进一步的迭代中你将一个LED置于OFF并将另一个LED置于ON,因此在每个时刻你有2个领导。

答案 3 :(得分:0)

如果你想按顺序点亮所有LED,然后立即将它们关闭等等等......

# constants
ON = (100, 100, 100)
OFF = (0, 0, 0)
N = 24

n = 0
while 1:

   if n%N == 0:
       px = [ OFF ] * N
       client.put_pixels(px)
       time.sleep(0.02)

   px[n%N] = ON
   client.put_pixels(px)
   time.sleep(0.02)

   n += 1