1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| from tkinter import *
from math import *
# définition des gestionnaires
# d'événements :
def move():
"déplacement de la balle avec rebonds"
global listeDesBalles, largeurScene, hauteurScene
# Etape 1 : récupérer les caractéristiques de la scène et des balles pour les limites
for i in range(len(listeDesBalles)):
rayonBalle = listeDesBalles[i][4]
limiteXDroit = largeurScene - rayonBalle
limiteXGauche = rayonBalle
limiteYHaut = rayonBalle
limiteYBas = hauteurScene - rayonBalle
# étape 2 : récupération des coordonnées et vitesses courante de la balle dans la liste
xc = listeDesBalles[i][0]
yc = listeDesBalles[i][1]
vx = listeDesBalles[i][2]
vy = listeDesBalles[i][3]
couleur = listeDesBalles[i][6]
# étape 3 : déplacement et gestion des limites, changement de couleur à chaque rebond
xc, yc = xc + vx, yc + vy
if xc > limiteXDroit:
xc, vx, vy = limiteXDroit, -vx, vy
couleur = 'blue'
if yc > limiteYBas:
yc, vx, vy = limiteYBas, vx, -vy
couleur = 'yellow'
if xc < limiteXGauche:
xc, vx, vy = limiteXGauche, -vx, vy
couleur = 'green'
if yc < limiteYHaut:
yc, vx, vy = limiteYHaut, vx, -vy
couleur = 'pink'
# étape 4 : sauvegarde des nouvelles valeurs
listeDesBalles[i][0] = xc
listeDesBalles[i][1] = yc
listeDesBalles[i][2] = vx
listeDesBalles[i][3] = vy
listeDesBalles[i][6] = couleur
# étape 5 : redessin dans le canvas
balle = can1.find_withtag(listeDesBalles[i][7])
can1.coords(balle,xc - rayonBalle, yc - rayonBalle , xc + rayonBalle, yc + rayonBalle)
can1.itemconfigure(balle, fill = couleur)
if flag > 0:
fen1.after(50,move) # => boucler, après 50 millisecondes
def creationDesBalles():
"Création des balles à partir de la liste"
for i in range(len(listeDesBalles)):
rayonBalle = listeDesBalles[i][4]
can1.create_oval(listeDesBalles[i][0] - rayonBalle, listeDesBalles[i][1] - rayonBalle , \
listeDesBalles[i][0] + rayonBalle, listeDesBalles[i][1] + rayonBalle, width=2, \
fill=listeDesBalles[i][6],tags=listeDesBalles[i][7])
def stop_it():
"arrêt de l'animation"
global flag
flag = 0
def start_it():
"démarrage de l'animation"
global flag
if flag == 0: # pour ne lancer quune seule boucle
flag = 1
creationDesBalles()
move()
## PROGRAMME PRINCIPAL
# les variables suivantes seront utilisées de manière globale :
listeDesBalles = []
# Ajout de balles : 0 1 2 3 4 5 6 7
# xc, yc, vx, vy, rayon, masse, couleur, nom
listeDesBalles.append([20, 20, 10, 10, 20, 0, 'red', 'Balle_1'])
listeDesBalles.append([60, 80, -15, 10, 30, 0, 'green', 'Balle_2'])
largeurScene = 400
hauteurScene = 500
score = 0
shoot = 15
flag = 0
# Création de l'interface graphique
# Création du widget principal ("parent") :
fen1 = Tk()
fen1.title("Animation multiballes Exo 8.30")
# création des widgets "enfants" :
bou1 = Button(fen1,text='Quitter', width = 8, command=fen1.destroy)
bou1.pack(side=BOTTOM, fill = X, expand = 1)
bou2 = Button(fen1, text='Démarrer', width = 8, command=start_it)
bou2.pack(side=BOTTOM, fill = X, expand = 1)
bou3 = Button(fen1, text='Arrêter', width = 8, command=stop_it)
bou3.pack(side=BOTTOM, fill = X, expand = 1)
can1 = Canvas(fen1,bg='dark grey',height=hauteurScene, width=largeurScene)
can1.pack(side=LEFT, padx =5, pady =5)
# démarrage du réceptionnaire d'événements (boucle principale) :
fen1.mainloop() |
Partager