Удалить time.sleep () из цикла for в Python? - PullRequest
1 голос
/ 25 мая 2019

У меня есть некоторые функции, которые управляют светодиодами RGB с вложенными циклами for, но примеры кода используют time.sleep (), и это блокирует выполнение остальной части моего кода.Я хочу удалить время сна из циклов for, но не знаю, как это сделать.

Я сделал эту функцию таймера, но она не работает.

currentTime = int(round(time.time() * 1000))
blinkWait = int(round(time.time() * 1000))

def CheckTime( lastTime,  wait):
  if currentTime - lastTime >= wait:
    lastTime += wait
    return True
  return False

def rainbowCycle(strip, wait_ms=20, iterations=5):
    """Draw rainbow that uniformly distributes itself across all pixels."""  
    for j in range(256*iterations):

        for i in range(strip.numPixels()):
            strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))

    if CheckTime(blinkWait,50):
       blinkWait = int(round(time.time() * 1000))
       strip.show()

Я пыталсяреализовать таймер, который получает текущее время, а затем проверяет прошедшее время, но не может интегрировать его в цикл for.

Это оригинальные примеры функций кода шаблона светодиода с time.sleep (), который я хочуудалить.

def rainbowCycle(strip, wait_ms=20, iterations=5):
    """Draw rainbow that uniformly distributes itself across all pixels."""  
    for j in range(256*iterations):

        for i in range(strip.numPixels()):
            strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
        strip.show()
        time.sleep(wait_ms/1000.0)

def theaterChaseRainbow(strip, wait_ms=50):
    """Rainbow movie theater light style chaser animation."""
    for j in range(256):
        for q in range(3):
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, wheel((i+j) % 255))
            strip.show()
            time.sleep(wait_ms/1000.0)
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, 0)

Заранее спасибо.

Обновление

Я пытался обернуть таймер вокруг вызова функции, но это неработать тоже.Должен быть способ обеспечить неблокирующую задержку между итерациями в цикле for, но я в растерянности.

                rainbowCycle(strip)
                blinkWait = int(round(time.time() * 1000))

Update # 2

curr_thread = threading.Thread(target=theaterChaseRainbow, args=(strip))
            curr_thread.daemon = False
            curr_thread.start()

но я получаю эту ошибку "Аргумент TypeError: theatreChaseRainbow () после * должен быть итеративным, а не Adafruit_NeoPixel"

Я также пытался поместить аргумент strip прямо в функцию.Это устраняет ошибку, но затем ничего не происходит.

def theaterChaseRainbow(strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_STRIP)):

Обновление # 3

По предложению @Aprillion я повторно посетил возможный повторяющийся пост.Я сделал все возможное, чтобы интегрировать эти предложения в мой код.Я добавил поток следующим образом

def theaterChaseRainbow(strip):
    """Rainbow movie theater light style chaser animation."""
    for j in range(256):
        for q in range(3):
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, wheel((i+j) % 255))
            strip.show()
            #time.sleep(.05)
            for i in range(0, strip.numPixels(), 3):
                strip.setPixelColor(i+q, 0)

def myTimer(seconds):
                time.sleep(seconds)
                theaterChaseRainbow(strip)

Затем в основном цикле я вызываю:

myThread = threading.Thread(target=myTimer, args=(.05,))
            myThread.start()

Это почти работает.Он отображает и мигает светодиодами, но он гораздо более неустойчивый и не плавный.Я думаю, это потому, что time.sleep находится во вложенном цикле for, а не для всей функции.Как мне сделать только вторую часть цикла сна?Я оставил оригинал time.sleep(.05) в качестве комментария в коде функции.

...