0

我正在为实时汽车转向信号编写代码。

我可以做一个 LED 闪光灯,我可以让一个多边形改变它的填充颜色来模拟一个转向信号。

这适用于领导:

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"

请帮忙。:)

我希望多边形和 LED 同步“闪烁”。我可以用谨慎的功能让它们单独闪烁,但不能一起闪烁。当我尝试在一个函数中调用这两个函数时,如上所述,灯会亮起,填充颜色会改变一次。

4

2 回答 2

0

使两个函数同时运行的最有效方法可能是使用线程或多处理模块。线程是预先安装的,通常用于多处理,这似乎是您在这里想要做的(并行运行两个函数)。这是一个例子:

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”目标后面没有括号(很容易错过,然后代码将无法工作)。我希望这有帮助!

于 2019-05-04T11:30:14.637 回答
0

.after(...)您可以使用而不是使用线程简单地打开/关闭同一功能内的 LED 和箭头:

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')
于 2019-05-06T08:42:56.410 回答