Как мне мигать светодиодом и одновременно изменить цвет заливки фигуры? - PullRequest
0 голосов
/ 04 мая 2019

Я пишу код для сигнала поворота живого автомобиля.

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

Это сработало для светодиода:

def blink_arrow():
    leftBlinker.blink(on_time=.7, off_time=.3, n=3)

и сработало для заливки формы:

def blink_arrow(count=0):
    global arrow_color
    global left_arrow
    if arrow_color == "green":
        left_arrow = c.create_polygon(50, 100, 150, 75, 150, 125, fill="gray")
    elif arrow_color == "gray":
        left_arrow = c.create_polygon(50, 100, 150, 75, 150, 125, fill="green")

    if count <5:
        w.after(300 if left_arrow=="green" else 700, blink_arrow, count+1)

Вот что я пробовал, но не сработало:

from tkinter import Canvas
from gpiozero import Button, LED

button = Button(23)
leftBlinker = LED(17)

def blink_arrow(count=0):
    leftBlinker.blink(on_time=.7, off_time=.3, n=1)
    global arrow_color
    global left_arrow
    if arrow_color == "green":
        left_arrow = c.create_polygon(50, 100, 150, 75, 150, 125, fill="gray")
    elif arrow_color == "gray":
        left_arrow = c.create_polygon(50, 100, 150, 75, 150, 125, fill="green")

    if count <5:
        w.after(300 if left_arrow=="green" else 700, blink_arrow, count+1)

#Build window, canvas, shape 

button.when_pressed = blink_arrow

ЗДЕСЬ НОВЫЙ КОД ПО ВАШЕМУ ПРЕДЛОЖЕНИЮ:

def blink_arrow(count=0)
    #code for function as written in my first example
    pass

def blink_leftLED():
    leftBlinker.blink(on_time=.7, off_time=.3, 3)
    pass

def left_signal():
    l1 = Thread(blink_arrow)
    l2 = Thread(blink_leftLED)
    l1.start()
    l2.start()

left_button.when_pressed = left_signal

Вот ошибка:

...line 28 in left_signal
l1 = Thread(blink_arrow)
...line reference to threading.py...
assert group is None, "group argument must be none for now"

Пожалуйста, помогите.:)

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

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Вы можете просто включить / выключить светодиод и стрелку внутри той же функции, используя .after(...) вместо использования потоков:

def left_signal(count=0, arrow_color='green'):
    blink_on = arrow_color == 'green'
    if blink_on:
        leftBlinker.on()
    else:
        leftBlinker.off()
    c.itemconfig(left_arrow, fill=arrow_color)
    if count < 5:
        w.after(300 if blink_on else 700, left_signal, count+1, 'gray' if blink_on else 'green')
0 голосов
/ 04 мая 2019

Вероятно, наиболее эффективный способ одновременного запуска двух функций - использование threading или модуля многопроцессорной обработки. Потоки поставляются предварительно установленными и часто используются для многопроцессорной обработки, что, по-видимому, и нужно сделать здесь (запустите две функции параллельно). Вот пример:

from threading import Thread

#rest of code

def function2():
   pass
def function1():
   pass

t1 = Thread(group=None,target=function1)
t2 = Thread(group=None,target=function2)
t1.start()
t2.start()

Или с помощью кнопки для вызова событий:

from gpiozero import Button, LED    
from threading import Thread

#rest of code

def function2():
   pass
def function1():
   pass

def main_functions():
   t1 = Thread(group=None,target=function1)
   t2 = Thread(group=None,target=function2)
   t1.start()
   t2.start()
button.when_pressed = main_functions

Это только некоторые примеры.

Обратите внимание, что за целями 'function1' или 'function2' в потоках НЕТ скобок (это легко пропустить, и тогда код не будет работать). Надеюсь, это поможет!

...