【问题标题】:How do I flash an LED and change the fill color of a shape at the same time?如何使 LED 闪烁并同时更改形状的填充颜色?
【发布时间】:2019-05-03 23:37:42
【问题描述】:

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

我可以让 LED 闪烁,我可以让多边形改变其填充颜色以模拟转向信号。

这适用于 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 同步“闪烁”。我可以用谨慎的功能让它们单独闪烁,但不能一起闪烁。当我尝试在单个函数中调用这两个函数时,如上所述,灯会亮起,填充颜色会改变一次。

【问题讨论】:

  • 是的,这是可能的,但是我们需要看看 Blinker 对象如何处理on_timeoff_time。就您的代码示例目前而言,它的范围使我们很难为您提供帮助;这是一个great resource,可以帮助您开始。祝你的代码好运!
  • 您向我发送了有关如何提问的说明。我遵循脚趾指南,因为我可以理解它们。我不明白你还需要什么。你能解释一下吗?我在代码示例中添加了一些东西。
  • 很抱歉没有指出这一点; 'pass' 是一个占位符命令。如果您没有要执行的功能,则使用 pass 只是跳过它。要使用该代码,请将“pass”关键字替换为您的代码即可。

标签: python-3.x function tkinter gpiozero


【解决方案1】:

让两个函数同时运行的最有效方法可能是使用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”目标后面没有括号(很容易错过,然后代码将无法工作)。我希望这会有所帮助!

【讨论】:

  • 太棒了!说得通!!谢谢!
  • 什么是“通过”?
  • 我在“这里是根据您的建议的新代码”下的第一个代码示例中添加了代码
  • Pass 是一个占位符命令。如果您没有要 de 的功能,则使用 pass 只是跳过它。要使用该代码,请将“pass”关键字替换为您的代码即可。
  • 太棒了!我让它工作了!对于 Thread() 它必须是 l1.Thread(group=None, target=function_name)
【解决方案2】:

您可以使用.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')

【讨论】:

    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多