# -*- encoding:Utf8 -*-

# Animation automatique d'une balle dans un canevas

from tkinter import *
from math import *

class Balle(object):
    "Balle se déplaçant dans un canevas"

    # Couleurs possibles pour la balle:
    coul = ['red', 'yellow', 'green', 'blue']

    def __init__(self, master, rayon=15, couleur='red'):
        
        self.rayon = rayon
        self.ang = 0.1      # angle de rotation (en radian)
        self.master = master
        self.can = master.can
        
        # coordonnées du centre de la balle:
        self.x = int(self.can.winfo_reqwidth()/2)+120
        self.y = int(self.can.winfo_reqheight()/2)

        # nombre de tours:
        self.i = 0

        # identifiant associé à la balle dans le canevas
        self.id = self.can.create_oval(self.x-rayon, self.y-rayon, self.x+rayon, self.y+rayon,
                            width=2, fill=Balle.coul[self.i])


    def avance(self):
        """
        Déplace autour d'un cercle imaginaire de rayon 120,
        centré au milieu du canevas
        """

        # mémorisation des anciennes coordonnées du centre de la balle:
        xp, yp = self.x, self.y

        # calcul des nouvelles coordonnées du centre de la balle sur
        # le cercle trigonométrique:
        x, y = cos(self.ang), sin(self.ang)

        # mise à l'échelle (cercle centré au milieu du canevas, de rayon 120):
        self.x = x*120 + int(self.can.winfo_reqheight()/2)
        self.y = y*120 + int(self.can.winfo_reqwidth()/2)

        # déplacement de la balle avec trace:
        self.can.coords(self.id, self.x-self.rayon, self.y-self.rayon,
                        self.x+self.rayon, self.y+self.rayon)
        self.can.create_line(xp, yp, self.x, self.y, width=2, fill='black')
        self.ang += 0.1

        # changement de couleurs tous les tours complets:
        if self.ang > 2*pi:
            self.ang -= 2*pi
            self.i = (self.i+1)%len(Balle.coul)
            self.can.itemconfigure(self.id, fill=Balle.coul[self.i])

        # appel récursif de la méthode:
        if self.master.flag > 0:
            self.master.after(50, self.avance)
       

class Application(Tk):

    def __init__(self, h=300, w=300):
        # Création du widget principal
        Tk.__init__(self)
        self.title("Exercice 8.14")

        # Création du canevas:
        self.can = Canvas(self, bg = "dark grey",
                          height=h, width=w)
        self.can.grid(row = 1, columnspan = 4)
                   
        # Création de la balle:                  
        self.balle = Balle(self)

        # Interrupteur de l'animation:
        self.flag = 0
        
        # Création des boutons:
        Button(self, text='Quitter', command=self.destroy).grid(row=2, column=1, padx=10, pady=5)
        Button(self, text='Démarrer', command=self.start_it).grid(row=2, column=2, padx=10, pady=5)
        Button(self, text='Arrêter', command=self.stop_it).grid(row=2, column=3, padx=10, pady=5)

    def start_it(self):
        "Démarrage de l'animation"
        if self.flag==0:
            self.flag=1
            self.balle.avance()

    def stop_it(self):
        "Arrêt de l'animation"
        self.flag=0
                  

#------ Programme principal -------

Application().mainloop()
