API Cours11 2p
API Cours11 2p
API Cours11 2p
Programmation
d'une interface
graphique
(tkinter)
Introduction
• tkinter : bibliothèque provenant de l’extension graphique Tk du
langage Tcl (1988).
• L’extension a largement dépassé le cadre de Tcl/Tk.
• Tk utilisable dans différents langages (Perl, Python, Ruby, ...)
• En python, c’est tkinter : Tk interface
• Permet de réaliser un GUI (Graphical User Interface)
• GUI : une interface homme-machine permettant à l’utilisateur
d’interagir avec la machine autrement que par le toplevel.
2
Schéma de la programmation classique
Ouverture
Traitement
Fermeture
Création du GUI
non
Evènement
à traiter ?
oui Traitement
Demande de non
fermeture ?
oui
Fermeture
4
Les widgets : gadgets de fenêtrage
• widget = window gadget : tous les composants de l’écran (fenêtres,
boutons, ascenseurs, ...)
contenu du Frame
texte bouton
(Label) (Button)
5
Structure du programme
message.pack()
affichage des composants
button.pack()
Les couleurs
• Une couleur peut s’exprimer :
label_etiquette['fg']='#xxyyzz'
http://www.w3schools.com/html/html_colors.asp
8
Exemple : intégration à la Monte-Carlo
• Il s’agit de calculer l’intégrale définie d’une fonction dont une primitive
est difficile ou impossible à calculer. En utilisant des probabilités.
def f(x) :
return 1 / (2 + x**3)
11
f(a+ih)
formule de Riemann
def integrale_riemann(f,a,b,N) :
h = (b - a) / N
return h * sum(f(a + i*h) for i in range(N))
>>> integrale_riemann(f,0,1,1000)
0.45090543481930634 Simplicité de l’écriture
en Python !…
12
L’interface graphique avec tkinter
titre de la
fenêtre racine
fenêtre racine
(root)
zone de dessin
champ de saisie de la
(canvas)
probabilité de succés
(entry_N)
canvas = Canvas(root,width=400,height=400,bg='yellow')
définition d'un
composant
canvas.pack() affichage du composant
14
Le canvas : une zone à dessiner, son système de coordonnées
x
(0,0) (400,0)
ATTENTION : ne pas
confondre le repère du
canvas (ci-contre) et le
repère mathématique
(origine en bas à
gauche, Oy vers le haut).
y
Il faudra faire un
changement de repère !
(0,400)
root.mainloop()
16
Widgets : Entry pour saisir une donnée et Label pour afficher un texte
• Le composant dans lequel l'utilisateur peut entrer le nombre de points
N est dans la classe Entry de tkinter. Plaçons ce composant dans le
canvas, précédé d’un composant Label pour un texte non éditable. Nous
incorporons ces deux composants dans un panneau horizontal invisible
hpanel de type Frame qui sera ajouté à la verticale, centré par défaut.
hpanel = Frame(root)
label_N = Label(hpanel,text='nb_points =')
label_N.pack(side=LEFT)
entry_N = Entry(hpanel,width=5) nb_points = 500
entry_N.pack(side=LEFT)
entry_N.insert(0,’500') # valeur initiale
hpanel.pack()
17
res = StringVar()
label_res = Label(root,textvariable = res)
label_res.pack()
res.set('integrale = ?')
18
Et enfin les deux boutons…
• Un bouton est un composant de la classe Button de tkinter. Son
attribut le plus important est command, contenant une fonction
d'arité 0. Cette fonction (le callback du bouton) sera automatiquement
exécutée suite à un clic de l'utilisateur dans le bouton.
canvas maths
x 400
1
M
Y
y
M
400
X 1
20
Dessin de la courbe de f
• Procédure de tracé du segment M1M2 où M1 et M2 sont donnés en
unités mathématiques :
21
def dessiner() :
canvas.delete(ALL)
plot()
N = int(entry_N.get())
succès = 0
for i in range(N) :
(X,Y) = (random(),random()) # coordonnées mathématiques
(x,y) = (X*400,400*(1-Y)) # coordonnées du canvas
if Y < f(X) : # dans la surface cherchée ?
succès = succès + 1
canvas.create_oval(x,y,x,y,outline='red')
else :
canvas.create_oval(x,y,x,y,outline='black')
proba = succès / N
res.set('integrale = {}'.format(proba))
22
OPTIONNEL1 : comment programmer une ANIMATION ?
• Thème approfondi au semestre 2 en langage Scheme. Pour faire simple : la
philosophie est MVC (Modèle-Vue-Contrôleur).
• Concept de base : le monde == ensemble des variables qui gouvernent le
phénomène physique. Il s’agit du modèle mathématique. Aucun dessin. On
commence par initialiser les variables du monde.
• Une fonction dessiner() sera chargée de dessiner une image d’après les
variables du monde. Une seule image, et elle ne modifie pas le monde.
• Une fonction suivant() sera chargée de mettre à jour les variables du monde
en prévision de la prochaîne image. Elle calcule ! Aucun dessin.
• Une fonction final() sera chargée de rendre True si le monde est dans état
final, où l’animation doit stopper. Elle rend False sinon.
23
# anim-mvc.py
# Python en L1-Sciences, Nice, 2016-2017
# Utilisation de tkinter pour une animation simple dans le style "MVC"
# https://fr.wikipedia.org/wiki/Modèle-vue-contrôleur
# Une balle qui descend le long de la diagonale du canvas et stoppe en bas
root = Tk()
root.resizable(False,False)
HAUTEUR = 400
LARGEUR = 400
canvas = Canvas(root, width=LARGEUR, height=HAUTEUR, bg='yellow')
canvas.pack()
animation()