【问题标题】:select first nth list items within a for loop在 for 循环中选择第一个列表项
【发布时间】:2016-05-13 13:15:30
【问题描述】:

我现在拥有的是下面的循环,它依次点亮每根 24 根 LED 灯。

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' object is not iterable”。

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

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 模式发生变化时,睡眠仍然会导致一些延迟。

【问题讨论】:

  • 我认为即使你的第一个 sn-p 也是完美的,除了初始的 pixels = [(0,0,0)] * numLEDs 应该位于 for 循环之前。
  • 斯蒂芬,我给出了一个答案,你希望每时每刻都打开两个连续的 LED,但现在我不太确定......如果我误解了你的 Q i很高兴删除我的 A。请告诉我。

标签: python opc fadecandy


【解决方案1】:

问题是你总是用全零覆盖你当前的像素状态。如果您在无限 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)

【讨论】:

    【解决方案2】:

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

    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)]
    

    如您所见,这将使其他人保持开启状态。

    【讨论】:

    • 如何根据 i 的值设置不同的颜色?我已经尝试过以下方法,但它相当笨拙` if i = 8 而不是 i > 16:像素 = [ (100,0,0) ] * 8 + [ (100,100,0) ] * (i) + [ (0,0,0) ] * (numLEDs - i + 8) elif i >= 16:像素 = [ (100,0,0) ] * 8 + [ (100,100,0) ] * 8 + [ (0,100,0) ] * (i) + [ (0,0, 0) ] * (numLEDs - i + 16) client.put_pixels(pixels, channel=0) time.sleep(0.5) `
    • @StephenHiggins 嗯,有趣的问题......让我思考一下
    【解决方案3】:

    如果您想按顺序点亮所有 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
    

    【讨论】:

      【解决方案4】:

      这是一个处理始终打开两个连续 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 个导通,在所有进一步的迭代中,您将一个导通关闭并打开另一个导通,所以在每一刻你都有2 灯亮。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        • 2012-03-21
        • 1970-01-01
        • 2022-01-06
        相关资源
        最近更新 更多