# Créé par apatura, le 04/03/2014 en Python 3.2 from tkinter import * # importation du module tkinter et de son contenu # Ce programme crée une fenêtre dans laquelle se déplace une boule qui rebondit sur les bords. # On clique à un endroit pour créer la boule # On entre la valeur de la vitesse en ms # On clique sur le bouton pour démarrer l'animation def creer(event): c.delete(rond) global x,y,rond # cette instruction permet de changer la valeur des variables globales # sinon on ne peut que les utiliser. x,y=event.x,event.y rond=c.create_oval(x-10,y-10,x+10,y+10,outline='red',fill='orange') def vitesse(event): global v v= entree.get() def deplacedroitebas(): global x,y # cette instruction permet de changer la valeur des variables globales # sinon on ne peut que les utiliser. if x<290 and y<190: f.after(v,deplacedroitebas) x=x+2 y=y+2 c.coords(rond,x-10,y-10,x+10,y+10) elif x>=290: deplacegauchebas() else: deplacedroitehaut() def deplacegauchebas(): global x,y if x>10 and y<190: f.after(v,deplacegauchebas) x=x-2 y=y+2 c.coords(rond,x-10,y-10,x+10,y+10) elif x<=10: deplacedroitebas() else: deplacegauchehaut() def deplacegauchehaut(): global x,y if x>10 and y>10: f.after(v,deplacegauchehaut) x=x-2 y=y-2 c.coords(rond,x-10,y-10,x+10,y+10) elif x<=10: deplacedroitehaut() else: deplacegauchebas() def deplacedroitehaut(): global x,y if x<290 and y>10: f.after(v,deplacedroitehaut) x=x+2 y=y-2 c.coords(rond,x-10,y-10,x+10,y+10) elif x>=290: deplacegauchehaut() else: deplacedroitebas() x,y,v=10,10,0 # variables globales , utilisables par toutes les fonctions déclarées. f=Tk() c=Canvas(f,height=200,width=300,bg='ivory') rond= c.create_oval(x-10,y-10,x+10,y+10,outline='red',fill='black') c.delete(rond) c.bind("",creer) c.pack(side=TOP) e=Button(f,text="Cliquer à un endroit puis donner la vitesse en ms",command=deplacedroitebas) e.pack() entree=Entry(f,background='white') entree.bind("",vitesse) entree.pack() b=Button(f,text="Quitter",command=f.quit)# on pourrait mettre simplement destroy() ce qui éviterait de le mettre après mainloop() b.pack() f.mainloop() f.destroy() """ COMMENTAIRES: Il y a de nombreuses ressources en ligne sur tkinter , en particulier l'excellent ouvrage de Swinnen à partir de la page 83 tkinter permet de créer des widgets: un widget maître (fenêtre principale) et des widgets qui seront mis à l'intérieur de cette fenêtre (widgets esclaves) f est une fenêtre principale , c'est un objet , instance de la classe Tk. Cette classe a des méthodes dont 3 importantes: mainloop() qui démarre le gestionnaire d'évènements , c'est une boucle infinie et elle s'utilise comme toute méthode par un point : f.mainloop() destroy() pour tout arrêter (arrête la boucle mainloop() et détruit la fenêtre) quit() pour arrêter la boucle infinie mais ne détruit pas la fenêtre Maintenant les widgets secondaires (esclaves) , il sont nombreux et ont parfois des méthodes spécifiques. La création: par l'instruction nom_du_widget=widget(paramètres ou champ) par exemple entree=Entry(f,background='white') Le premier "paramètre" ou "champ" doit être le nom de la fenêtre principale dans laquelle on veut le placer. Les autres , soit on leur met une valeur particulière soit on ne met rien et ce sont les valeurs par défaut qui sont utilisées. Dans l'exemple , entree est un objet , instance de la classe Entry avec comme premier "paramètre" f la fenêtre principale et le second la valeur de la couleur de fond Les différents widgets: Canvas Button Text StringVar Frame Label et bien d'autres Une méthode importante pour tous ces widgets : La méthode pack() avec des arguments spécifiques qui permet de positionner le widget dans la fenêtre par exemple c.pack(side=TOP) Il y a d'autres méthodes de positionnement Gestionnaire d'évènements La méthode bind permet d'interagir entre un widget et une fonction selon un évènement particulier Voilà 2 exemples: Avec le clavier (interaction entre c qui est un canvas et la fonction creer) c.bind("",creer) :l'évènement ici est un clic gauche sur la souris à un endroit du canvas (zône de dessin) et exécute alors la fonction creer. La fonction creer a comme paramètre event pour indiquer qu'elle est liée à un évènement. Cette fonction prend les coordonnées de l'endroit où il y a eu le clic et dessine un disque à cet endroit. A chaque clic , il se passera la même chose et l'intruction delete(rond) efface le disque existant avant d'en créer un autre. Avec le clavier (interaction entre entree et la fonction vitesse) entree.bind("",vitesse) : l'évènement est ici l'appui sur la touche entrée du clavier et exécute la fonction vitesse Cette fonction renvoie la valeur saisie par l'utilisateur et la met dans la variable v grâce à l'intruction v= entree.get() Comme pour creer cette fonction a event comme paramètre. Cas du widget Button La fonction se trouvant comme valeur du "champ" command sera exécutée lors d'un clic sur ce bouton comme par exemple command=deplacedroitebas dans le widget e Remarquez que les fonctions comme "valeur" d'un "champ" d'un widget sont sans parathèses """