Как мне мигать светодиодом и одновременно изменить цвет заливки фигуры?
Я пишу код для живого автомобиля сигнала поворота.
Я могу сделать светодиодную вспышку, и я могу заставить полигон изменить цвет заливки, чтобы имитировать сигнал поворота.
Это сработало для светодиодов:
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 ответа
Вы можете просто включить / выключить светодиод и стрелку внутри той же функции, используя .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')
Вероятно, наиболее эффективный способ одновременного запуска двух функций - это использование многопоточности или многопроцессорного модуля. Потоки поставляются предварительно установленными и часто используются для многопроцессорной обработки, что, по-видимому, и нужно сделать здесь (запустите две функции параллельно). Вот пример:
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' в потоках НЕТ скобок (это легко пропустить, и тогда код не будет работать). Надеюсь, это поможет!