MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
Module 12
Les interfaces graphiques avec Tkinter
Les objectifs sp cifiques
Manipuler les diff rents contr les dune interface
Utiliser les v nements
Le module Tkinter ("Tk interface") de Python permet de cr er des interfaces
graphiques (GUI : graphical user interface). Il est disponible sur Windows et la plupart des
syst mes Unix. Les interfaces que vous pourrez d velopper auront donc toutes les chances
d' tre portables d'un syst me l'autre.
Notez qu'il existe d'autres biblioth ques pour cr er des interfaces graphiques. Tkinter a
l'avantage d' tre disponible par d faut, sans n cessiter une installation suppl mentaire.
Plusieurs autres biblioth ques graphiques fort int ressantes ont t propos es pour
Python : wxPython, pyQT, pyGTK, etc.
1. Les widgets Tkinter
Une interface graphique contient g n ralement un objet de base de type Tk (souvent
la fen tre de base). Dans cet objet sont plac s d'autres objets, comme des cadres (Frame),
des labels (Label), des boutons (Button), des champs de saisie (Entry), &.
Notez aussi la pr sence de la ligne mainloop. Il s'agit de la fondamentale boucle des
v nements. Une fois les objets graphiques cr s et affich s, le programme entre dans cette
boucle et g re les v nements clavier, souris, provoqu s par l'utilisateur, ainsi que le
r affichage des objets (si la fen tre est occult e, redimensionn e etc&).
Voici un petit programme qui illustre ces tapes :
import tkinter # import de tkinter
root = tkinter.Tk () # cr ation de la fen tre principale
root.title("Exemple") # titre de la fen tre principale
root.geometry("420x220") # dimension de la fen tre principale
...
obj =tkinter.Label (text = "zone de texte") #cr ation dun objet label
...
Enseignante :Mme Lamia MANSOURI
1
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
obj.pack () # on ajoute l'objet la fen tre principale
root.mainloop () # on affiche enfin la fen tre principal et on attend
1.1 Le contr le zone de texte
Une zone de texte sert ins rer dans une fen tre graphique une l gende indiquant
ce quil faut ins rer dans contr le voisin. Une zone de texte correspond la classe Label.
Pour cr er une zone de texte, il suffit d crire la ligne suivante :
zone_texte = tkinter.Label (text = "zone de texte")
Il est possible de modifier les couleurs du texte et du fond :
label = tk.Label( text="Salut tout le monde !", fg="blue", bg="yellow")
Il est possible que le texte de cette zone de texte doive changer apr s quelques temps. Dans
ce cas, il faut appeler la m thode config comme suit :
zone_texte = tkinter.Label (text = "premier texte")
...
pour changer de texte
zone_texte.config (text = "second texte")
1.2 Le contr le zone de saisie
Une zone de saisie a pour but de recevoir une information entr e par lutilisateur. Une
zone de saisie correspond la classe Entry ; pour en cr er une, il suffit d crire la ligne
suivante :
saisie = tkinter.Entry ()
Pour modifier le contenu de la zone de saisie, il faut utiliser la m thode insert qui ins re un
texte une position donn e.
le premier param tre est la position
o ins rer le texte donn en second param tre
saisie.insert (pos, "contenu")
Pour obtenir le contenu de la zone de saisie, il faut utiliser la m thode get :
contenu = saisie.get ()
Pour supprimer le contenu de la zone de saisie, il faut utiliser la m thode delete. Cette
m thode supprime le texte entre deux positions.
Enseignante :Mme Lamia MANSOURI
2
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
supprime le texte entre les positions pos1, pos2
saisie.delete (pos1, pos2)
Par exemple, pour supprimer le contenu dune zone de saisie, on peut utiliser linstruction
suivante :
saisie.delete (0, len(saisie.get()))
1.3 Le contr le zone de saisie plusieurs lignes
Une zone de saisie plusieurs lignes est identique la pr c dente ceci pr s quelle
autorise la saisie dun texte sur plusieurs lignes. Cette zone correspond la classe Text.
Pour cr er une telle zone, il suffit d crire la ligne suivante :
saisie = tkinter.Text ()
Pour modifier le contenu de la zone de saisie, il faut utiliser la m thode insert qui ins re un
texte une position donn e. La m thode diff re de celle de la classe Entry puisque la
position dinsertion est maintenant une cha ne de caract res contenant deux nombres
Publicité
s par s par un point : le 1er nombre d signe la ligne, le second la position sur cette ligne.
le premier param tre est la position
o ins rer le texte (second param tre)
pos = "0.0"
saisie.insert (pos, "premi re ligne \n seconde ligne")
Pour obtenir le contenu de la zone de saisie, il faut utiliser la m thode get qui retourne le
texte entre deux positions. La position de fin nest pas connue, on utilise la cha ne de
caract res "end" pour d signer la fin de la zone de saisie.
retourne le texte entre deux positions
pos1 = "0.0"
pos2 = "end" # ou tkinter.END
contenu = saisie.get (pos1, pos2)
Pour supprimer le contenu de la zone de saisie, il faut utiliser la m thode delete. Cette
m thode supprime le texte entre deux positions.
supprime le texte entre les positions pos1, pos2
saisie.delete (pos1, pos2)
Par exemple, pour supprimer le contenu dune zone de saisie plusieurs lignes, on peut
utiliser linstruction suivante :
saisie.delete ("0.0", "end")
on peut aussi utiliser
saisie.delete ("0.0", tkinter.END)
Enseignante :Mme Lamia MANSOURI
3
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
Pour modifier les dimensions de la zone de saisie plusieurs lignes, on utilise linstruction
suivante :
modifie les dimensions de la zone
width <--> largeur
height <--> hauteur en lignes
saisie.config (width = 10, height = 5)
1.4 Le contr le Case cocher
Une case cocher correspond la classe Checkbutton. Pour cr er une case cocher, il
suffit d crire la ligne suivante :
cr e un objet entier pour r cup rer la valeur de la case cocher,
0 pour non coch e, 1 pour coch e
v = tkinter.IntVar ()
case = tkinter.Checkbutton (variable = v)
Deux objets qui sont cr s. Le premier, de type IntVar, m morise la valeur de la case
cocher. Le second objet, de type Checkbutton, g re lapparence au niveau de linterface
graphique. Pour savoir si la case est coch e ou non, il suffit dex cuter linstruction :
v.get () # gal 1 si la case est coch e, 0 sinon
Pour cocher et d cocher la case, il faut utiliser les instructions suivantes :
case.select () # pour cocher
case.deselect () # pour d cocher
Il est possible dassocier du texte lobjet case cocher :
case.config (text = "case cocher")
1.5 Le contr le bouton radio
Un bouton radio correspond la classe Radiobutton. Le fonctionnement est
semblable des cases cocher except le fait quelles napparaissent jamais seules : elles
fonctionnent en groupe. Pour cr er un groupe de trois cases rondes, il suffit d crire la
ligne suivante :
#cr e un objet entier partag pour r cup rer le n du bouton radio activ
v = tkinter.IntVar ()
case1 = tkinter.Radiobutton (variable = v, value = 10)
case2 = tkinter.Radiobutton (variable = v, value = 20)
Enseignante :Mme Lamia MANSOURI
4
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
case3 = tkinter.Radiobutton (variable = v, value = 30)
La variable v est partag e par les trois cases rondes. Loption value du constructeur permet
dassocier un bouton radio une valeur de v. Si v == 10, seul le premier bouton radio sera
s lectionn . Si v == 20, seul le second bouton radio le sera. Si deux valeurs sont identiques
pour deux boutons radio, ils seront coch s et d coch s en m me temps. Et pour savoir quel
bouton radio est coch ou non, il suffit dex cuter linstruction :
v.get () # retourne le n du bouton radio coch (ici, 10, 20 ou 30)
Pour cocher un des boutons radio, il faut utiliser linstruction suivante :
v.set (numero) #n du bouton radio cocher pour cet exemple,10,20 ou 30
Il est possible dassocier du texte un bouton radio.
case1.config (text = "premier bouton")
case2.config (text = "second bouton")
case3.config (text = "troisi me bouton")
1.6 Le contr le Liste
Un objet liste contient une liste dintitul s quil est possible de s lectionner. Une liste
correspond la classe ListBox. Pour la cr er, il suffit d crire la ligne suivante :
li = tkinter.Listbox ()
Pour modifier les dimensions de la zone de saisie plusieurs lignes, on utilise linstruction
suivante :
modifie les dimensions de la liste, hauteur en lignes
Publicité
li.config (width = 10, height = 5)
On peut ins rer un l ment dans la liste avec la m thode insert :
pos = 0 # un entier, "end" ou tkinter.END pour ins rer ce mot la fin
li.insert (pos, "premi re ligne")
On peut supprimer des intitul s de cette liste avec la m thode delete.
pos1 = 0 # un entier
pos2 = None #un entier,"end" ou tkinter.END pour supprimer tous les
l ments de pos1 jusqu'au dernier
Enseignante :Mme Lamia MANSOURI
5
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
li.delete (pos1, pos2 = None)
Les intitul s de cette liste peuvent ou non tre s lectionn s. Cliquer sur un intitul le
s lectionne mais la m thode select_set permet aussi de le faire.
pos1 = 0
li.select_set (pos1, pos2 = None)
s lectionne tous les l ments entre les indices pos1 et
pos2 inclus ou seulement celui d'indice pos1 si pos2 == None
R ciproquement, il est possible denlever un intitul de la s lection laide de la
m thode select_clear.
pos1 = 0
li.select_clear (pos1, pos2 = None)
retire la s lection de tous les l ments entre les indices
pos1 et pos2 inclus ou seulement celui d'indice pos1 si pos2 == None
La m thode curselection permet dobtenir la liste des indices des l ments s lectionn s.
sel = li.curselection ()
La m thode get permet r cup rer un l ment de la liste tandis que la m thode codes{size}
retourne le nombre d l ments :indextkk{size}indextkk{get}
for i in range (0, li.size()):
print(li.get (i))
1.7 Liste avec barre de d filement, Combobox
Cest une liste avec une barre de d filement incluse qui est pr sente dans
lextension ttk qui tend la liste des objets propos s par tkinter. Cest ce que fait
lobjet ttk.Combobox.
import tkinter
import tkinter.ttk as ttk
root = tkinter.Tk()
o =ttk.Combobox(root, values=["ligne 1", "ligne 2", "ligne3", "ligne4"])
o.pack ()
def print_file () : # voir le chapitre sur les v nements
print(o.get())
b = tkinter.Button (root, text="print")
b.config (command = print_file) # idem
b.pack ()
Enseignante :Mme Lamia MANSOURI
6
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
root.mainloop()
1.8 Bouton
Un bouton a pour but de faire le lien entre une fonction et un clic de souris. Un bouton
correspond la classe Button Pour cr er un bouton, il suffit d crire la ligne suivante :
bouton = tkinter.Button (text = "zone de texte")
Il est possible que le texte de ce bouton change apr s quelques temps. Dans ce cas, il faut
appeler la m thode config comme suit :
bouton = tkinter.Button (text = "premier texte")
...
pour changer de texte
bouton.config (text = "second texte")
2. Disposition des objets dans une fen tre
2.1 Emplacements
Chacun des objets (ou widgets) pr sent s au paragraphe pr c dent poss de trois
m thodes qui permettent de d terminer sa position dans une fen tre. Pour les placer, il faut
appeler les m thodes pack(), place() ou grid() du widget. Les deux premi res permettent
de disposer les objets sans se soucier ni de leur dimension ni de leur position. La fen tre
g re cela automatiquement. La derni re place les objets dans une fen tre laide de
coordonn es sans utiliser laide daucune grille. Dans une fen tre, tous les objets doivent
tre plac s avec la m me m thode. Dans le cas contraire, les r sultats risquent ne pas tre
ceux attendus.
2.1.1 M thode pack
Cette m thode empile les objets les uns la suite des autres. Par d faut, elle les empile les
uns en dessous des autres. Par exemple, lexemple suivant produit lempilement des objets.
l = tkinter.Label (text = "premi re ligne")
l.pack ()
s = tkinter.Entry ()
s.pack ()
e = tkinter.Label (text = "seconde ligne")
e.pack ()
Les objets sont empil s laide de la m thode pack les uns en dessous des autres pour la
Publicité
premi re image, les uns droite des autres pour la seconde image.
Enseignante :Mme Lamia MANSOURI
7
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
On peut aussi les empiler les uns droite des autres gr ce loption side.
l = tkinter.Label (text = "premi re ligne")
l.pack (side = tkinter.RIGHT)
s = tkinter.Entry ()
s.pack (side = tkinter.RIGHT)
e = tkinter.Label (text = "seconde ligne")
e.pack (side = tkinter.RIGHT)
La m thode pack poss de trois options :
" side choisir entre tkinter.TOP (valeur par d faut), tkinter.LEFT
, tkinter.BOTTOM , tkinter.RIGHT
" expand : gale True ou False (valeur par d faut), si cette option est vraie, lobjet
occupe tout lespace.
" fill : gale None (valeur par d faut), X, Y, BOTH, lobjet s tend selon un axe (X
ou Y ou les deux).
Lorsquun objet nest plus n cessaire, il est possible de le faire dispara tre en appelant la
m thode pack_forget. Le rappel de la m thode pack le fera r appara tre mais rarement au
m me endroit.
s.pack_forget() # disparition
s.pack() # insertion un autre endroit
2.1.2 M thode grid
La m thode grid suppose que la fen tre qui les contient est organis e selon une grille dont
chaque case peut recevoir un objet. Lexemple suivant place trois objets dans les cases de
coordonn es (0,0), (1,0) et (0,1).
l = tkinter.Label (text = "premi re ligne")
l.grid (column = 0, row = 0)
s = tkinter.Entry ()
s.grid (column = 0, row = 1)
e = tkinter.Label (text = "seconde ligne")
e.grid (column = 1, row = 0)
Les objets sont plac s dans une grille laide de la m thode grid. Une fois que chaque
objet a re u une position, laffichage, il ne sera pas tenu compte des lignes et colonnes
vides.
Enseignante :Mme Lamia MANSOURI
8
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
La m thode grid poss de plusieurs options, en voici cinq :
" column : colonne dans laquelle sera plac e lobjet.
" columnspan : nombre de colonnes que doit occuper lobjet.
"
"
"
row : ligne dans laquelle sera plac e lobjet.
rowspan : nombre de lignes que doit occuper lobjet.
sticky : indique ce quil faut faire lorsque la case est plus grande que lobjet quelle
doit contenir. Par d faut, lobjet est centr mais il est possible daligner lobjet sur
un ou plusieurs bords en pr cisant que sticky="N" ou "S" ou "W" ou "E". Pour
aligner lobjet sur un angle, il suffit de concat ner les deux lettres correspondant
aux deux bords concern s. Il est aussi possible d tendre lobjet dun bord lautre
en crivant sticky="N+S" ou sticky="E+W".
Enfin, comme pour la m thode pack, il existe une m thode grid_forget qui permet de faire
dispara tre les objets.
s.grid_forget() # disparition
2.1.3 M thode place
La m thode place permet de placer chaque objet une position d finie par des
coordonn es. Elle peut tre utilis e en parall le avec les m thodes place et grid.
l = tkinter.Label(text="premi re ligne")
l.place (x=10, y=50)
La m thode place_forget permet de faire dispara tre un objet plac avec cette m thode.
Linconv nient de cette m thode survient lorsquon cherche modifier lemplacement
dun objet : il faut en g n ral revoir les positions de tous les autres l ments de la fen tre.
2.2 Sous-fen tre
Les trois m thodes pr c dentes ne permettent pas toujours de placer les l ments comme
on le d sire. On souhaite parfois regrouper les objets dans des bo tes et placer celles-ci les
unes par rapport aux autres. Cest aussi la seule fa on de r utiliser un groupe de contr le
ou widgets dans plusieurs fen tres sans avoir dupliquer le code. La figure suivante
montre deux objets regroup s dans un rectangle avec sa gauche une zone de texte. Les
bo tes sont des instances de la classe Frame.
Les deux premiers objets, une zone de texte au-dessus dune zone de saisie, sont regroup s
dans une bo te rectangle rouge, invisible l cran. A droite et centr e, une derni re zone
Enseignante :Mme Lamia MANSOURI
9
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
de texte. Cet alignement est plus simple r aliser en regroupant les deux premiers objets
dans un object Frame. Pour cr er une bo te, il suffit d crire la ligne suivante :
Publicité
f = tkinter.Frame ()
Ensuite, il faut pouvoir affecter un objet cette bo te f. Pour cela, il suffit que f soit le
premier param tre du constructeur de lobjet cr :
l = tkinter.Label (f, text = "premi re ligne")
Lexemple qui suit correspond au code qui permet dafficher la fen tre de la figure ci-
dessus.
f = tkinter.Frame ()
l = tkinter.Label (f, text = "premi re ligne")
l.pack () # positionne l l'int rieur de f
s = tkinter.Entry (f)
s.pack () # positionne s l'int rieur de f
f.pack (side = tkinter.LEFT) # positionne f l'int rieur
de la fen tre principale
e = tkinter.Label (text = "seconde ligne")
e.pack_forget ()
e.pack (side = tkinter.RIGHT) # positionne e l'int rieur de la
#fen tre principale
3. Les v nements
Il est possible de r cup rer des v nements, comme la frappe d'une touche ou un clic de
souris pour effectuer un traitement sp cial. Pour qu'un widget puisse traiter les
v nements, il faut que celui-ci ait le focus. G n ralement, un widget prend le focus
lorsque l'on clique dessus. Les v nements peuvent ensuite tre trait s par une fonction.
3.1 Focus
Une fen tre peut contenir plusieurs zones de saisie, toutes capables dintercepter la
pression dune touche du clavier et dajouter la lettre correspondante la zone de saisie.
Or la seule qui ajoute effectivement une lettre son contenu est celle qui a le focus. La
pression de la touche tabulation fait passer le focus dun objet lautre. La figure ci-
dessous montre un bouton qui a le focus. Lorsquon d sire quun objet en particulier ait le
focus, il suffit dappeler la m thode focus_set.
Ce bouton est entour dun cercle noir en pointill , il a le focus. Pour changer le focus :
e = tkinter.Entry(root)
Enseignante :Mme Lamia MANSOURI
10
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
e.pack()
e.focus_set()
3.2 Lancer une fonction lorsquun bouton est press
La plupart de temps, le seul v nement quon souhaite attraper est la pression dun bouton.
Le code suivant permet de cr er un bouton dont lidentificateur est b. Il a pour
intitul fonction change_legende. On d finit ensuite une fonction change_legende qui
change la l gende de ce bouton. Lavant-derni re ligne permet dassocier au bouton b la
fonction change_legende qui est alors appel e lorsque le bouton est press . La derni re
ligne affiche la fen tre principale et lance lapplication.
import tkinter
root = tkinter.Tk ()
b = tkinter.Button (text = "fonction change_legende")
b.pack ()
def change_legende () :
global b
b.config (text = "nouvelle l gende")
b.config (command = change_legende)
root.mainloop ()
Lorsque le bouton b est press , on v rifie quil change bien de l gende. La premi re
fen tre est celle qui appara t lorsque le programme est lanc . Comme le bouton change de
l gende la premi re fois quil est press , lapparence de la fen tre change aussi, ce que
montre la seconde image.
3.2 Associer nimporte quel v nement un objet
Le paragraphe pr c dent sest int ress lassociation entre une fonction et la pression
dun bouton mais il est possible de faire en sorte que le programme ex cute une fonction
au moindre d placement de la souris, la pression dune touche. Il est possible dassocier
une fonction au moindre v nement susceptible d tre intercept par linterface graphique.
On peut regrouper les v nements en deux classes. La premi re classe regroupe les
v nements provenant du clavier ou de la souris. Ce sont des v nements en quelque
sorte bruts. La seconde classe regroupe des v nements produit par des objets tels quun
bouton. En effet, lorsque celui-ci d tecte le clic du bouton droit de la souris, il construit un
v nement pression du bouton et cest celui-ci qui va d clencher lex cution dune
fonction. Il nest pas souvent n cessaire de revenir aux v nements bruts car les objets
proposent deux-m mes de pouvoir attacher des fonctions des v nements li s leur
apparence.
Enseignante :Mme Lamia MANSOURI
11
MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON
La liste compl te est accessible avec linstruction suivante :
import tkinter
help(tkinter.Event)
Enseignante :Mme Lamia MANSOURI
12