# -*- encoding:Utf8 -*-

# Simulation d'une boule de billard

from tkinter import *
from math import *

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

    def __init__(self, master, rayon=15, couleur='red'):
        
        self.rayon = rayon
        self.master = master
        self.can = master.can
        
        # coordonnées du centre de la balle:
        self.x = 125
        self.y = 125

        # composantes initiales du vecteur vitesse de la balle:
        self.dx, self.dy = 10, 5

        # identifiant associélf.rayon à 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='red')


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

        # modification des coordonnées du centre de la balle:
        self.x += self.dx
        self.y += self.dy

        if self.x > 250-self.rayon:
            # la balle tape contre la paroi de droite
            self.x = 250-self.rayon
            self.dx = -self.dx
        if self.y > 250-self.rayon:
            # la balle tape contre la paroi du bas
            self.y = 250-self.rayon
            self.dy = -self.dy
        if self.x < self.rayon:
            # la balle tape contre la paroi de gauche
            self.x = self.rayon
            self.dx = -self.dx
        if self.y < self.rayon:
            # la balle tape contre la paroi du haut
            self.y = self.rayon
            self.dy = -self.dy

        # déplacement de la balle:
        self.can.coords(self.id, self.x-self.rayon, self.y-self.rayon,
                        self.x+self.rayon, self.y+self.rayon)

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

class Application(Tk):

    def __init__(self):
        # Création du widget principal
        Tk.__init__(self)
        self.title("Exercice 8.15")

        # Création du canevas:
        self.can = Canvas(self, bg = "dark grey",
                          height=250, width=250)
        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)
        Button(self, text='Démarrer', command=self.start_it).grid(row=2, column=2)
        Button(self, text='Arrêter', command=self.stop_it).grid(row=2, column=3)

    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()
