# -*- encoding:Utf8 -*-

# Animation manuelle d'une balle dans un canevas

from tkinter import *
from math import sin, cos

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

    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)

        # 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='red')

    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 imaginaire centré et de rayon 120)
        self.x = x*120 + int(self.can.winfo_reqwidth()/2)
        self.y = y*120 + int(self.can.winfo_reqheight()/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='blue')
        self.ang += 0.1
       

class Application(Tk):

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

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

        
        # Création des boutons:
        Button(self, text='Quitter', command=self.destroy).grid(row=2, column=1, padx=10, pady=5)
        Button(self, text='Déplacer', command=self.balle.avance).grid(row=2, column=2, padx=10, pady=5)
           

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

Application().mainloop()
