from tkinter import *

def cercle(can, x, y, r, coul='black'):
    "dessin d'un cercle de rayon <r> en <x,y> dans le canevas <can>"
    can.create_oval(x-r, y-r, x+r, y+r, outline=coul)

class Application(Tk):
    def __init__(self):
        Tk.__init__(self)        # constructeur de la classe parente
        self.can=Canvas(self, width =475, height =130, bg ="white")
        self.can.pack(side =TOP, padx =5, pady =5)
        bou1=Button(self, text ="Train", command =self.dessine)
        bou1.pack(side =LEFT)
        bou2=Button(self, text ="Hello", command =self.coucou)
        bou2.pack(side =LEFT)
        bou3=Button(self, text ="Allumer", command =self.eclairer)
        bou3.pack(side =LEFT)
        
    def dessine(self):
        "instanciation de 4 wagons dans le canevas"
        self.w1 = Wagon(self.can, 10, 30)
        self.w2 = Wagon(self.can, 130, 30,'red')
        self.w3 = Wagon(self.can, 250, 30, 'pink')
        self.w4 = Wagon(self.can, 370, 30, 'gray')
        
    def coucou(self):
        "apparition de personnages dans certaines fenêtres"
        self.w2.perso(1)        # 2e wagon, 1e fenêtre
        self.w2.perso(2)        # 2e wagon, 2e fenêtre
        self.w2.perso(3)        # 2e wagon, 3e fenêtre
        self.w4.perso(1)        # 4e wagon, 1e fenêtre
        self.w4.perso(3)        # 4e wagon, 3e fenêtre

    def eclairer(self):
        "éclairage des fenêtres"
        self.w2.allumer()        # éclairage wagon 2
        self.w4.allumer()        # éclairage wagon 4
        
class Wagon(object):
    def __init__(self, canevas, x, y, couleur = 'navy'):
        "dessin d'un petit wagon en <x,y> dans le canevas <canevas>"
        # mémorisation des paramètres dans des variables d'instance :
        self.canevas, self.x, self.y = canevas, x, y
        # rectangle de base : 95x60 pixels :
        canevas.create_rectangle(x, y, x+95, y+60, fill=couleur)
        # 3 fenêtres de 25x40 pixels, écartées de 5 pixels :
        self.fen = []   # liste mémorisant les références aux fenêtres 
        for xf in range(x +5, x +90, 30):
            newFen = canevas.create_rectangle(xf, y+5, xf+25, y+40,
                                              fill = 'black')
            self.fen.append(newFen)
        # 2 roues de rayon égal à 12 pixels  :
        cercle(canevas, x+18, y+73, 12)
        cercle(canevas, x+77, y+73, 12)
  
    def perso(self, fen):
        "apparition d'un petit personnage à la fenêtre <fen>"
        # calcul des coordonnées du centre de chaque fenêtre :
        xf = self.x + fen*30 -12
        yf = self.y + 25
        cercle(self.canevas, xf, yf, 10)      # visage
        cercle(self.canevas, xf-5, yf-3, 2)   # oeil gauche        
        cercle(self.canevas, xf+5, yf-3, 2)   # oeil droit
        cercle(self.canevas, xf, yf+5, 3)     # bouche

    def allumer(self):
        "change la couleur des fenêtres du wagon"
        for f in self.fen:
            self.canevas.itemconfigure(f, fill = 'yellow')

# Programme principal:

monApp = Application()  # instanciation de l'objet-application

monApp.mainloop()       # lancement du réceptionnaire d'événements
