0 – Interface Graphique : tkinter

Interface graphique

Nos programmes jusqu’à présent était en mode console. Cette façon de programmer permet d’apprendre tous les aspects du langage sans avoir à se soucier de l’affichage, ni du son. Elle est plus facile et le code est performant mais l’interaction est peu attirante, peu ergonomique. L’interface graphique, est seulement une « surcouche » ajoutée au langage, permettant d’afficher des fenêtres, des images ou des boutons par exemple, pour un meilleur confort d’utilisation au détriment de la performance due à la gestion de l’affichage graphique.

Différence de conception

En mode console généralement le programme s’exécute au fur et à mesure du fichier. C’est votre programme qui pilote les évènements, qui demande une information, qui guide pas à pas le déroulement des choses.
shell Avec une interface graphique, c’est différent, le programme ne « pilote » plus les évènements, mais il est cette fois « piloté » par ceux-ci. Il est en quelque sorte au service de l’utilisateur et doit agir en fonction des actions de celui-ci sur l’environnement : clavier, souris … on parle de gestion d’événement, généralement codée à l’aide d’une boucle, qui s’effectue tant qu’aucun événement ne se produit.

tkinter-dialog

L’interface graphique installée par défaut est : tkinter

unknown

Un élément graphique comme un bouton,  une case à cocher ou une fenêtre de saisie est appelé widget et se caractérise par :

  • des options qui sont ses propriétés
  • et des méthodes qui désignent des actions qu’on peut lui appliquer.

Les options sont précisées entre parenthèses au moment de la création du widget. Les méthodes sont invoqués ensuite.

Exemple 1 : Dans un script Python testez les lignes suivantes :

ex1Remarque : Le fait d'avoir utilisé le positionneur pack() sans aucun paramètre, les widgets sont positionnés automatiquement l'un en dessous de l'autre.ex2

Exemple 2 : Testez les lignes suivantes et commentez-les.

 

Les Widgets : Label, Entry, Text , …

nom = Label(parent, option=valeur, option=valeur, . . .)

Ce widget permet d’afficher un texte sur une ou plusieurs lignes. Il peut aussi servir à afficher une image.

nom = Entry(parent, option=valeur, option=valeur, . . .)

Ce widget d’une seule ligne  permet de saisir un texte.

nom = Text(parent, option=valeur, option=valeur, . . .)

Ce widget permet d’éditer un texte de plusieurs lignes. Le texte peut être formaté (fonte, couleur, . . .). Pour récupérer le contenu du widget, on utilise la méthode nom.get(), qui retourne une chaîne.

ex3

Exemple 3 : Testez et commentez les lignes suivantes

La méthode pack() place les widgets dans l’espace qui n’est pas encore utilisé et adapte la taille de la fenêtre pour contenir tous les widgets. Par défaut, les widgets sont placés les uns en dessous des autres en commençant par le haut.

L’option side permet de positionner le widget dans l’espace disponible. Elle peut prendre la valeur LEFT, RIGHT, TOP ou BOTOM.

Au début, l’espace disponible est constitué de la totalité du widget père (conteneur). Une fois le widget positionné, on se retrouve avec un nouvel espace disponible dans lequel on recommence de la même manière.

ex3b

tkinter possède de nombreux autres widgets comme Checkbutton (qui retourne une valeur parmi deux selon qu’il est ou pas coché) ou Radiobutton, (qui permet de faire un choix parmi plusieurs) ou encore Optionmenu (qui permet de sélectionner une valeur dans une liste déroulante).

Le positionneur pack

Autres options :

  • l’option fill précise comment le widget va remplir l’espace disponible. Cette option peut prendre la valeur X pour horizontal, Y pour vertical, BOTH pour les deux et NONE pour aucun.
  • L’option expand permet préciser si le widget doit suivre le redimensionnement de son conteneur. Cette option peut prendre la valeur 1 ou 0
  • Les options padx et pady permettent de définir les marges extérieures (en pixel) horizontales et verticales autour du widget (couleur marron) … ipadx et ipady pour les marges intérieures.

ex3c

  • L’option anchor. Par défaut, quand le widget ne remplit pas son espace, il est centré. Cette option permet de l’ancrer sur l’un des quatre cotés ou l’un des quatre coins.

ex3d

Pour plus de souplesse, on peut commencer par placer des frames qui pourront à leur tour recevoir des widgets. A l’intérieur de ces nouveaux conteneurs, rien ne nous oblige d’utiliser le positionneur pack(), on peut très bien utiliser le positionneur grid() ou place()

Les positionneurs grid() et place()

La méthode grid() permet de positionner les widgets dans un conteneur comme une fenêtre ou un frame. Le conteneur est organisé comme une grille de cellules. Pour placer un widget dans une cellule:  widget.grid(row=valeur, column=valeur)

Au départ, on ne crée pas la grille en définissant un nombre de lignes ou de colonnes. La grille est crée au momment où on y place des widgets. Si on place un widget dans la cellule (1,1) et un autre dans la cellule (4, 3) alors une grille à quatre ligne et 3 colonnes est crée.

ex3e

Une ligne ou une colonne dont toutes les cellules sont vide n’est pas visible à moins qu’on définisse une taille minimum obligatoire:

L’option rowspan permet d’occuper plusieurs cellules :

On peut aussi imposer une marge horizontale et verticale par rapport aux bords de la cellule à l’aides des options padx et pady

Le positionneur place() permet définir les positions absolues (x,y) des widget ainsi que leur dimensions.

Le widget : Canvas

Un canevas est une surface rectangulaire délimitée, dans laquelle on peut installer ensuite divers dessins et images à l’aide de méthodes spécifiques : can = Canvas(parent,option=valeur,option=valeur,…)

ex4

Exemple 4 : Testez et commentez les lignes suivantes

voir le site de Fabrice Sincère.

Les Frames

nom = Frame(parent, option=valeur, option=valeur, . . .)

Ce widget est un conteneur qui peut recevoir d’autres widgets. Le positionnement des widgets à l’intérieur de chaque frame est indépendant du positionneur utilisé dans le parent du Frame.

nom = LabelFrame(parent, option=valeur, option=valeur, . . .)

Ce widget est le même que le widget Frame avec en plus la possibilité d’afficher un texte sur la bordure du frame.

ex5

Exemple 5 : Testez et commentez les lignes suivantes

 

Gestion des événements clavier et souris : la méthode .bind()

Tkinter offre la possibilité de lier un widget avec un événement:

widget.bind(événement , fonctions)

L’événement peut venir du clavier ou de la souris mais pas seulement. Chaque fois que l’événement survient, la fonction est appelée. L’événement est représenté par une chaîne le plus souvent comme cela : <événement>  ou ‘<événement>’

Evénement Clavier

  • ‘<KeyPress>’, ‘<KeyPress-A>’, ‘<A>’,  ’A’, ‘<KeyRelease>’ , ‘<KeyRelease-B>
  • ‘<Up>’,  ‘<Down>’,  ‘<Left>’,   ‘<Right>
  • ‘<Tab>’, ‘<Escape>’, ‘<Return>’, ‘<Caps_Lock>’, ‘<Num_Lock>’, ‘<Alt_R>’, ‘<Control_L>’,  ‘<Shift_R>’

Evénement Souris

  • <Button>,<Button-n> ,<ButtonRelease-n>  –> Le bouton n a été cliqué ou relâché (1=gauche, 2=centre, 3=droite)
  • <Bn-Motion> –> La sourie a bougé avec le bouton n appuyé
  • <Double-Button-n> –> Le bouton n a été double cliqué ou relâché (1=gauche, 2=centre, 3=droite)
  • <Enter>, <Leave> –> Le pointeur de la souris vient d’entrer ou de sortir du widget

Le module tkinter permet également la gestion :

  • de messages dans des fenêtres surgissantes (tkinter.messagebox / showinfo)
  • de menu déroulant (Menu(tk))
  • de boîte de dialogue pour les fichiers (tkinter.filedialog / askopenfilename)

 

Exemple 6 : Testez cet exemple permettant d’afficher une image gif dans une fenêtre et commentez les fonctions Clic et Annuler.

 

Enfin, voici un petit mémo bien pratique pour toutes les instructions en Tkinter.