如何动态更新tkinter画布小部件?

时间:2020-02-23 14:14:16

标签: python-3.x user-interface tkinter simulation

我正在编写一个模拟铁路信号的程序,该程序最终将在通过ADC接收模拟信号以驱动不同信号颜色的Raspberry Pi上运行。

我对GUI编程非常不好,所以我的问题是,如何编写一个函数来更改每个“ LED”的颜色,每次检测到高电压时最终可以调用该LED?现在,我只想拥有一个函数set_top_signal(“ Green”),可以调用该函数来更新图形。

然后我想编写一个函数,以每半秒打开和关闭信号闪烁一次。 flash_top_signal(“绿色”)

Current GUI Photo

import tkinter as tk

class WaysideSimulator(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        # self.pack()
        self.grid()
        self.create_widgets()

    def create_widgets(self):

        self.Searchlight_Button = tk.Button(self, text="Start Simulation", command=self.start_simulation())
        # self.Searchlight_Button.pack(side="bottom")
        self.Searchlight_Button.grid(row=0, column=0)

        self.End_Simulation_Button = tk.Button(self, text="End Simlation", fg="red", command=self.master.destroy)
        # self.End_Simulation_Button.pack(side="bottom")
        self.End_Simulation_Button.grid(row=1, column=0)

        # Draw the Signal Rectangle
        self.canvas = tk.Canvas(self, width=500, height=500, bg="white")
        # self.rectangle.pack()
        self.canvas.grid()

        # Draw the Searchlight Signal Heads
        self.signal_pole = self.canvas.create_rectangle(245, 20, 255, 500, fill="grey")

        self.top_signal_head = self.canvas.create_oval(200, 10, 300, 110, fill="black")
        self.middle_signal_head = self.canvas.create_oval(200, 160, 300, 260, fill="black")
        self.bottom_signal_head = self.canvas.create_oval(200, 310, 300, 410, fill="black")

        self.top_signal_light = self.canvas.create_oval(240, 50, 260, 70, fill="red")
        self.middle_signal_light = self.canvas.create_oval(240, 200, 260, 220, fill="yellow")
        self.bottom_signal_light = self.canvas.create_oval(240, 350, 260, 370, fill="green")

    def set_top_signal_color(self, color):
        self.canvas.delete(self.top_signal_light)
        self.canvas.delete(self.middle_signal_light)
        self.canvas.delete(self.bottom_signal_light)

        """
        Signal Color Code Chart:
        0 = Black(Off)
        1 = Red
        2 = Yellow
        3 = Green
        """
        if color == "Off":
            self.top_signal_light = self.canvas.create_oval(240, 50, 260, 70, fill="black")
        elif color == "Red":
            self.top_signal_light = self.canvas.create_oval(240, 50, 260, 70, fill="red")
        elif color == "Yellow":
            self.top_signal_light = self.canvas.create_oval(240, 50, 260, 70, fill="yellow")
        elif color == "Green":
            self.top_signal_light = self.canvas.create_oval(240, 50, 260, 70, fill="green")

    def start_simulation(self):
        print("Searchlight Simulation Started")


def main():
    root = tk.Tk()
    root.title("Searchlight Simulator")
    root.geometry("500x525")
    root.resizable(0, 0)
    s1 = WaysideSimulator(master=root)
    s1.mainloop()


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

我最近问了一个类似的问题,关于旋转骰子图像以模拟一对骰子滚动。也许,如果您需要做的只是将“旋转”为新的“信号”图像,那么您可以从我在此链接上发布的工作代码中删除所需的内容(请提供acw1668的帮助,如果没有他们的帮助,我就不会到达工作版本) !):

Tkinter, python 3.8.1, win10Pro, How can I change a label image?