Initiation à la programmation en Python

Programming, GUI, Python, Tkinter · course

Voir tous les documents en programmation

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