Я пытаюсь вызвать функцию по нажатию кнопки, которая вызовет вторую функцию, которая обновляет цвет заливки овала. Я получаю сообщение об ошибке, что объект не имеет атрибута. Целью программы будет в конечном итоге обновить цвета световых сигналов в виде переменных, связанных с каждым 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()