#!/usr/bin/env python3

from tkinter import *
from tkinter import ttk

# --------------------------
# Model
# --------------------------

class TLight:
    def __init__(self):
        self.colors = {0: "red", 1: "yellow", 2: "green", 3: "yellow"}
        self.status = 0
        
    def switch(self):
        if self.status < max(self.colors.keys()):
            self.status += 1
        else:
            self.status = 0
            
    def print_color(self):
        print(self.colors[self.status])
        
    def get_color(self):
        return self.colors[self.status]
    
# --------------------------
# Controller
# --------------------------

class TLightController:
    def __init__(self, app):
        self.app = app
        self.tlight = TLight()
        
    def change_light(self, event=None):
        self.tlight.switch()
        self.update_view()
        
    def update_view(self):
        color = self.tlight.get_color()
        self.app.change_light_display(color)
        

# --------------------------
# View / Main Application
# --------------------------

class TLightApp(Tk):
    def __init__(self):
        super().__init__()
        self.controller = TLightController(self)
        
        self.create_widgets()
        self.create_light()
        self.bind_events()
        
    def create_widgets(self):
        mainframe = ttk.Frame(self, padding="3 3 3 3")
        mainframe.grid(column=0, row=0, sticky=N+W+S+E)
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)
        
        button_switch = ttk.Button(mainframe, text="Schalte um", command=self.controller.change_light)
        button_switch.grid(column=0, row=0, sticky=W)
                light_canvas = Canvas(mainframe, width=50, height=50, background="black")
        light_canvas.grid(column=1, row=0, sticky=W)
        self.lc = light_canvas
        
    def create_light(self, color="red"):
        self.light = self.lc.create_oval(10,10,40,40,fill=color)
        
    def bind_events(self):
        self.bind("<Return>", self.controller.change_light)
    
    def change_light_display(self, color):
        self.lc.itemconfigure(self.light, fill=color)
        
# --------------------------
# Execution
# --------------------------
if __name__ == "__main__":
    app = TLightApp()
    app.mainloop()
