首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python创建一行图像的Knight Rider风格流LED

用Python创建一行图像的Knight Rider风格流LED
EN

Stack Overflow用户
提问于 2016-10-14 20:45:45
回答 2查看 740关注 0票数 0

我在学习用树莓皮和圆脸展开板的蟒蛇。使用Tkinter,我创建了一个带有按钮的Gui来操作π面LED。在代码的一部分中,我打开了一个新窗口,它显示了一个按钮和一排处于“关闭”状态的LED图像。我试图添加一些代码,使LED图像的行流,在'on‘状态左到右沿图像行,就像骑士车的前灯。我在while循环中尝试过一些东西,但是如果没有很多代码行,我就无法很好地理解如何实现它。我认为一定有办法做到这一点,就像数字写入是增量,以创建在piface扩展板上的流式LED。这是我的密码。

代码语言:javascript
运行
复制
class App2:

    def __init__(self, master):
            self.signal = False    #added to stop thread
            print('self.signal', self.signal)

            self.master=master    # I added this line to make the exit button work
            frame = Frame(master)
            frame.pack()
            Label(frame, text='Turn LED ON').grid(row=0, column=0)
            Label(frame, text='Turn LED OFF').grid(row=0, column=1)

            self.button0 = Button(frame, text='Knight Rider OFF', command=self.convert0)
            self.button0.grid(row=2, column=0)
            self.LED0 = Label(frame, image=logo2)   #added to create a row of images
            self.LED1 = Label(frame, image=logo2)
            self.LED2 = Label(frame, image=logo2)
            self.LED3 = Label(frame, image=logo2)
            self.LED4 = Label(frame, image=logo2)
            self.LED5 = Label(frame, image=logo2)
            self.LED6 = Label(frame, image=logo2)
            self.LED7 = Label(frame, image=logo2)
            self.LED0.grid(row=2, column=1)
            self.LED1.grid(row=2, column=2)
            self.LED2.grid(row=2, column=3)
            self.LED3.grid(row=2, column=4)
            self.LED4.grid(row=2, column=5)
            self.LED5.grid(row=2, column=6)
            self.LED6.grid(row=2, column=7)
            self.LED7.grid(row=2, column=8)

            self.button9 = Button(frame, text='Exit', command=self.close_window)
            self.button9.grid(row=3, column=0)


    def convert0(self, tog=[0]):

        tog[0] = not tog[0]

        if tog[0]:
            print('Knight Rider ON')
            self.button0.config(text='Knight Rider ON')
            t=threading.Thread(target=self.LED)
            t.start()
            self.signal = True    #added to stop thread
            print('self.signal', self.signal)
            print('tog[0]', tog[0])
            self.LED0.config(image = logo)
        else:
            print('Knight Rider OFF')
            self.button0.config(text='Knight Rider OFF')
            self.signal = False   #added to stop thread
            print('self.signal', self.signal)
            print('tog[0]', tog[0])
            self.LED0.config(image = logo2)


    def LED(self):
            while self.signal:   #added to stop thread

                a=0

                while self.signal:   #added to stop thread
                        pfio.digital_write(a,1) #turn on
                        sleep(0.05)
                        pfio.digital_write(a,0) #turn off
                        sleep(0.05)
                        a=a+1

                        if a==7:
                                break

                while self.signal:   #added to stop thread

                        pfio.digital_write(a,1) #turn on
                        sleep(0.05)
                        pfio.digital_write(a,0) #turn off
                        sleep(0.05)
                        a=a-1

                        if a==0:
                                break

    def close_window(self):
            print('Knight Rider OFF')
            print('self.signal', self.signal)
            self.button0.config(text='Knight Rider OFF')
            self.LED0.config(image = logo2)
            self.signal = False   #added to stop thread
            print('self.signal', self.signal)


            sleep(1)
            print('Close Child window')
            self.master.destroy()   # I added this line to make the exit button work

root = Tk()
logo2 = PhotoImage(file="/home/pi/Off LED.gif")
logo = PhotoImage(file="/home/pi/Red LED.gif")

root.wm_title('LED on & off program')
app = App(root)

root.mainloop()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-14 21:32:12

您不需要线程来完成这样简单的任务。如果任务不超过几百毫秒(如果需要更长的时间,UI将开始滞后),那么在tkinter中设置持久的重复任务是非常容易的。

基本模式是编写一个做一些工作的函数,然后让该函数使用after再次调用它自己。例如:

代码语言:javascript
运行
复制
def animate():
    # do something, such as turn an led on or off
    <some code here to turn one led on or off>

    # run this again in 100 ms
    root.after(100, animate)

上面将创建一个无限循环,运行在tkinter的主循环中。只要<some code here... >不需要太长时间,动画就会显得流畅,你的UI也不会滞后。

示例

下面是这项技术的一个简单的工作示例。它使用一个简单的迭代器循环通过led,但您可以使用任何算法,您想要选择下一个led亮起。您也可以同时打开或关闭屏幕和硬件,或者打开或关闭多个led等等。

要使此代码可复制/粘贴,它使用彩色框架而不是图像,但如果需要,则可以使用图像。

代码语言:javascript
运行
复制
import tkinter as tk  # Tkinter for python 2
from itertools import cycle

class LEDStrip(tk.Frame):
    segments = 16
    speed = 100 # ms

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        leds = []
        for i in range(self.segments):
            led = tk.Frame(self, width=12, height=8, borderwidth=1, 
                           relief="raised", background="black")
            led.pack(side="left", fill="both", expand=True)
            leds.append(led)

        self.current_segment = None
        self.iterator = cycle(leds)

    def animate(self):
        # turn off the current segment
        if self.current_segment:
            self.current_segment.configure(background="black")

        # turn on the next segment
        self.current_segment = next(self.iterator)  # self.iterator.next() for python 2
        self.current_segment.configure(background="red")

        # run again in the future
        self.after(self.speed, self.animate)


root = tk.Tk()
strip = LEDStrip(root)
strip.pack(side="top", fill="x")

# start the loop
strip.animate()

root.mainloop()
票数 1
EN

Stack Overflow用户

发布于 2016-10-15 00:26:13

可能不是你想要的,但你可以得到一些灵感,建立这个“赛隆”算法在终端上的第一。LED没有中等的颜色值,但我想残余的光感应该能做到这一点。

代码语言:javascript
运行
复制
import sys,time
shift = lambda l, n=1: l[n:]+l[:n]
c = u' ▁▂▃▄▅▆▇' # possible color values
L = 8           # number of items
B = L*[0]       # indices of items
A = [0] + list(range(7)) + list(range(7,0,-1)) + 6*[0]  # light sequence
C = L*[' ']     # start blank

while 1:
   B[A[0]]=L            # set the most brilliant light 
   for x in range(L):
      B[x]-= 1           # decrease all lights values
      B[x] = max(0,B[x]) # not under 0
      C[x] = c[B[x]]     # get the corresponding 'color'
   A = shift(A,-1)       # shift the array to the right
   sys.stdout.write(('%s%s%s')%(' ',''.join(C[1:]),'\r'))
   time.sleep(0.1)

或者试试那个https://www.trinket.io/python/79b8a588aa

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40051731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档