Initiation à la Programmation en Python - Module 12

Page 1 sur 12Lecteur de document UniversityLib

Initiation à la Programmation en Python - Module 12

Programming with Python - GUI Development using Tkinter · course

Voir tous les documents en programmation

MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON

Module

12

Les objectifs spécifiques

  • Manipuler les différents contrôles d’une 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 :

Enseignante :Mme Lamia MANSOURI 1

MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON

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 qu’il 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 :

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 :

1.2 Le contrôle zone de saisie

Une zone de saisie a pour but de recevoir une information entrée par l’utilisateur. Une zone de saisie correspond à la classe Entry ; pour en créer une, il suffit d’écrire la ligne suivante :

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.

Pour obtenir le contenu de la zone de saisie, il faut utiliser la méthode 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.

Publicité

Enseignante :Mme Lamia MANSOURI 2

MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON

Par exemple, pour supprimer le contenu d’une zone de saisie, on peut utiliser l’instruction suivante :

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 qu’elle autorise la saisie d’un texte sur plusieurs lignes. Cette zone correspond à la classe Text. Pour créer une telle zone, il suffit d’écrire la ligne suivante :

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 d’insertion est maintenant une chaîne de caractères contenant deux nombres séparés par un point : le 1er nombre désigne la ligne, le second la position sur cette 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 n’est pas connue, on utilise la chaîne de caractères "end" pour désigner la fin de la zone de saisie.

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.

Par exemple, pour supprimer le contenu d’une zone de saisie à plusieurs lignes, on peut utiliser l’instruction suivante :

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 l’instruction suivante :

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 :

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 l’apparence au niveau de l’interface graphique. Pour savoir si la case est cochée ou non, il suffit d’exécuter l’instruction :

Pour cocher et décocher la case, il faut utiliser les instructions suivantes :

Il est possible d’associer du texte à l’objet 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 qu’elles n’apparaissent jamais seules : elles fonctionnent en groupe. Pour créer un groupe de trois cases rondes, il suffit d’écrire la ligne suivante :

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. L’option value du constructeur permet d’associer 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 d’exécuter l’instruction :

Pour cocher un des boutons radio, il faut utiliser l’instruction suivante :

Il est possible d’associer du texte à un bouton radio.

1.6 Le contrôle Liste

Publicité

Un objet liste contient une liste d’intitulés qu’il est possible de sélectionner. Une liste correspond à la classe ListBox. Pour la créer, il suffit d’écrire la ligne suivante :

Pour modifier les dimensions de la zone de saisie à plusieurs lignes, on utilise l’instruction suivante :

On peut insérer un élément dans la liste avec la méthode insert :

On peut supprimer des intitulés de cette liste avec la méthode delete.

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.

Réciproquement, il est possible d’enlever un intitulé de la sélection à l’aide de la méthode select_clear.

La méthode curselection permet d’obtenir la liste des indices des éléments sélectionnés.

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}

1.7 Liste avec barre de défilement, Combobox

C’est une liste avec une barre de défilement incluse qui est présente dans l’extension ttk qui étend la liste des objets proposés par tkinter. C’est ce que fait l’objet ttk.Combobox.

Enseignante :Mme Lamia MANSOURI 6

MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON

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 :

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 :

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 à l’aide de coordonnées sans utiliser l’aide d’aucune 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, l’exemple suivant produit l’empilement des objets.

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

Publicité

On peut aussi les empiler les uns à droite des autres grâce à l’option side.

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, l’objet occupe tout l’espace.

  • fill : égale à None (valeur par défaut), X, Y, BOTH, l’objet s’étend selon un axe (X ou Y ou les deux).

Lorsqu’un objet n’est 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.

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. L’exemple suivant place trois objets dans les cases de coordonnées (0,0), (1,0) et (0,1) .

Les objets sont placés dans une grille à l’aide de la méthode grid. Une fois que chaque objet a reçu une position, à l’affichage, 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 l’objet.

  • columnspan : nombre de colonnes que doit occuper l’objet.

  • row : ligne dans laquelle sera placée l’objet.

  • rowspan : nombre de lignes que doit occuper l’objet.

  • sticky : indique ce qu’il faut faire lorsque la case est plus grande que l’objet qu’elle doit contenir. Par défaut, l’objet est centré mais il est possible d’aligner l’objet sur un ou plusieurs bords en précisant que sticky="N" ou "S" ou "W" ou "E". Pour aligner l’objet sur un angle, il suffit de concaténer les deux lettres correspondant aux deux bords concernés. Il est aussi possible d’étendre l’objet d’un bord à l’autre 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.

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.

La méthode place_forget permet de faire disparaître un objet placé avec cette méthode. L’inconvénient de cette méthode survient lorsqu’on cherche à modifier l’emplacement d’un 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. C’est 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 d’une 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

Publicité

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 :

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 l’objet créé :

L’exemple qui suit correspond au code qui permet d’afficher la fenêtre de la figure cidessus.

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 d’intercepter la pression d’une touche du clavier et d’ajouter 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 d’un objet à l’autre. La figure cidessous montre un bouton qui a le focus. Lorsqu’on désire qu’un objet en particulier ait le focus, il suffit d’appeler la méthode focus_set.

Ce bouton est entouré d’un cercle noir en pointillé, il a le focus . Pour changer le focus :

Enseignante :Mme Lamia MANSOURI 10

MASTERE BADS COURS : INTIATION A LA PROGRAMMATION EN PYTHON

3.2 Lancer une fonction lorsqu’un bouton est pressé

change la légende de ce bouton. L’avant-dernière ligne permet d’associer 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 l’application.

fenêtre est celle qui apparaît lorsque le programme est lancé. Comme le bouton change de légende la première fois qu’il est pressé, l’apparence de la fenêtre change aussi, ce que montre la seconde image.

3.2 Associer n’importe quel événement à un objet

Le paragraphe précédent s’est intéressé à l’association entre une fonction et la pression d’un 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 d’une touche. Il est possible d’associer une fonction au moindre événement susceptible d’être intercepté par l’interface 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 qu’un 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 c’est celui-ci qui va déclencher l’exécution d’une fonction. Il n’est pas souvent nécessaire de revenir aux événements bruts car les objets proposent d’eux-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 l’instruction suivante :

Enseignante :Mme Lamia MANSOURI 12