Обновить виджет холста tkinter по нажатию кнопки - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь вызвать функцию по нажатию кнопки, которая вызовет вторую функцию, которая обновляет цвет заливки овала. Я получаю сообщение об ошибке, что объект не имеет атрибута. Целью программы будет в конечном итоге обновить цвета световых сигналов в виде переменных, связанных с каждым go от 0 до 1, но сейчас я просто заставляю сервер работать. Я просмотрел десятки примеров за последние два дня и не могу заставить это работать.

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):
        # Draw Buttons
        self.Start_Simulation_Button = tk.Button(self, text="Start Simulation", command=self.start_simulation)
        self.Start_Simulation_Button.grid(row=0, column=0)

        self.End_Simulation_Button = tk.Button(self, text="End Simulation", fg="red", command=self.master.destroy)
        self.End_Simulation_Button.grid(row=1, column=0)

        # Top Signal Buttons
        self.Top_Red_Button = tk.Button(self, text="Set Top Signal Red", command=self.set_top_red)
        self.Top_Red_Button.grid(row=2, column=0)

        self.Top_Yellow_Button = tk.Button(self, text="Set Top Signal Yellow", command=self.set_top_yellow)
        # self.Searchlight_Button.pack(side="bottom")
        self.Top_Yellow_Button.grid(row=3, column=0)

        self.Top_Green_Button = tk.Button(self, text="Set Top Signal Green", command=self.set_top_green)
        self.Top_Green_Button.grid(row=4, column=0)

        self.Top_Black_Button = tk.Button(self, text="Set Top Signal Black", command=self.set_top_off)
        self.Top_Black_Button.grid(row=5, column=0)

        # Middle Signal Buttons
        self.Middle_Red_Button = tk.Button(self, text="Set Middle Signal Red", command=self.set_middle_red)
        self.Middle_Red_Button.grid(row=2, column=1)

        self.Middle_Yellow_Button = tk.Button(self, text="Set Middle Signal Yellow", command=self.set_middle_yellow)
        self.Middle_Yellow_Button.grid(row=3, column=1)

        self.Middle_Green_Button = tk.Button(self, text="Set Middle Signal Green", command=self.set_middle_green)
        self.Middle_Green_Button.grid(row=4, column=1)

        self.Middle_Black_Button = tk.Button(self, text="Set Middle Signal Black", command=self.set_middle_black)
        self.Middle_Black_Button.grid(row=5, column=1)

        # Bottom Signal Buttons
        self.Bottom_Red_Button = tk.Button(self, text="Set Bottom Signal Red", command=self.set_bottom_red)
        self.Bottom_Red_Button.grid(row=2, column=2)

        self.Bottom_Yellow_Button = tk.Button(self, text="Set Bottom Signal Yellow", command=self.set_bottom_yellow)
        self.Bottom_Yellow_Button.grid(row=3, column=2)

        self.Bottom_Green_Button = tk.Button(self, text="Set Bottom Signal Green", command=self.set_bottom_green)
        self.Bottom_Green_Button.grid(row=4, column=2)

        self.Bottom_Black_Button = tk.Button(self, text="Set Bottom Signal Black", command=self.set_bottom_black)
        self.Bottom_Black_Button.grid(row=5, column=2)

        # Draw the Canvas
        self.canvas = tk.Canvas(self, width=500, height=500, bg="white")
        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", tags="top_light")
        self.top_signal_light_ON = True
        self.middle_signal_light_ON = self.canvas.create_oval(240, 200, 260, 220, fill="yellow", tags="middle_light")
        self.middle_light_ON = True
        self.bottom_signal_light = self.canvas.create_oval(240, 350, 260, 370, fill="green", tags="bottom_light")
        self.bottom_signal_light_ON = True

    # Function Definitions

    def set_top_red(self):
        self.canvas.itemconfig("top_light", fill="Red")
        self.top_signal_light_ON = True
        print("Top signal is RED")

    def set_top_yellow(self):
        self.canvas.itemconfig("top_light", fill="yellow")
        self.top_signal_light_ON = True
        print("Top signal is YELLOW")

    def set_top_green(self):
        self.canvas.itemconfig("top_light", fill="green")
        self.top_signal_light_ON = True
        print("Top signal is GREEN.")

    def set_top_off(self):
        self.canvas.itemconfig("top_light", fill="black")
        self.top_signal_light_ON = False
        print("Top signal is OFF.")

    def set_middle_red(self):
        self.canvas.itemconfig("middle_light", fill="Red")
        self.middle_light_ON = True
        print("Middle signal is RED")

    def set_middle_yellow(self):
        self.canvas.itemconfig("middle_light", fill="yellow")
        self.middle_light_ON = True
        print("middle signal is YELLOW")

    def set_middle_green(self):
        self.canvas.itemconfig("middle_light", fill="green")
        self.middle_light_ON = True
        print("Middle signal is GREEN.")

    def set_middle_black(self):
        self.canvas.itemconfig("middle_light", fill="black")
        self.middle_light_ON = False
        print("Middle signal is OFF.")

    def set_bottom_red(self):
        self.canvas.itemconfig("bottom_light", fill="Red")
        self.middle_light_ON = True
        print("Bottom signal is RED")

    def set_bottom_yellow(self):
        self.canvas.itemconfig("bottom_light", fill="yellow")
        self.middle_light_ON = True
        print("Bottom signal is YELLOW")

    def set_bottom_green(self):
        self.canvas.itemconfig("bottom_light", fill="green")
        self.middle_light_ON = True
        print("Bottom signal is GREEN.")

    def set_bottom_black(self):
        self.canvas.itemconfig("bottom_light", fill="black")
        self.middle_light_ON = False
        print("Bottom signal is OFF.")

    # Simulation Functions
    def start_simulation(self):
        print("Searchlight Simulation Started")
        self.canvas.itemconfig("top_light", fill="black")
        self.canvas.itemconfig("middle_light", fill="black")
        self.canvas.itemconfig("bottom_light", fill="black")
        self.top_signal_light_ON = False
        self.middle_signal_light_ON = False
        self.bottom_signal_light_ON = False
        print("All signals are OFF")



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


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...