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
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
# Créé par x, le 25/05/2014
#~ from __future__ import division
#~ from lycee import *
from math import sin, cos, pi
from time import time
from Tkinter import *
#Programme traçant une trajectoire double sinusoidale
#---- Affichage de la position au temps t
def play ():
"boucle d'animation bille"
global X0, Y0
# init différentiel temps
dt = time() - t0
# nouvelle position bille
X = X0 - (Rroulette - Rbille * dt) * sin(pi * dt)
Y = Y0 - (Rroulette - Rbille * dt) * cos(-pi * dt)
# déplacement bille
canvas.coords(bille, X-Rbille, Y-Rbille, X+Rbille, Y+Rbille)
# bille arrivée vers le centre (X0, Y0) ?
if (X0-2 <= X <= X0+2) and (Y0-2 <= Y <= Y0+2):
# on annonce dans la console
print "Terminé !\n\nBille au centre !"
# on réautorise le bouton "lancer"
bouton_lancer.configure(state=NORMAL)
# bille toujours pas arrivée au centre
else:
# on continue de boucler
# toutes les 50 millisecondes
fenetre.after(50, play)
# end if
# end def
def lancer_bille ():
"lancer de bille"
global t0
# on désactive le bouton "lancer"
# pour éviter des lancements parasites
bouton_lancer.configure(state=DISABLED)
# on initialise le marqueur temps zéro
# pour un nouveau lancer
t0 = time()
# on lance la boucle d'animation de la bille
play()
# end def
#---- Initialisation des variables
X0, Y0 = (200, 200)
Rbille = 5
Rroulette = 80
#-Programme principal
#--- Ouverture de la fenêtre principale
fenetre = Tk()
#---- Définition d'un canevas appelé canvas
canvas = Canvas(fenetre, bg='dark green', height=400, width=400)
canvas.pack(side=RIGHT)
roulette = canvas.create_oval(120, 120, 280, 280, width=10, fill="RosyBrown4")
bille = canvas.create_oval(195, 195, 205, 205, width=0, fill='white')
bouton_lancer = Button(fenetre, text='lancer', command=lancer_bille)
bouton_lancer.pack(padx=5, pady=5)
Button(fenetre, text="Quitter", command=fenetre.destroy).pack(side=BOTTOM, padx=5, pady=5)
fenetre.mainloop() |
Partager