Interface Graphique : Fenêtres

Les interfaces graphiques servent à rendre les programmes plus conviviaux. Elles sont pratiques à utiliser mais elles demandent un peu de temps pour les concevoir.
Un programme fonctionne de manière différente. Il n’exécute plus successivement les instructions mais attend un événement - pression d’une touche du clavier, clic de souris - pour exécuter une fonction. C’est comme si le programme avait une multitude de points d’entrée.

Il existe plusieurs modules permettant d’exploiter les interfaces graphiques. Le plus simple est le module tkinter présent lors de l’installation du langage Python. Ce module est simple mais limité. Le module wxPython est plus complet mais un peu plus compliqué dans son utilisation. Toutefois, le fonctionnement des interfaces graphiques sous un module ou un autre est identique. C’est pourquoi ce chapitre n’en présentera qu’un seul, le module tkinter. Pour d’autres modules, les noms de classes changent mais la logique reste la même : il s’agit d’associer des événements à des parties du programme Python.

Les interfaces graphiques évoluent sans doute plus vite que les autres modules, des composantes de plus en plus complexes apparaissent régulièrement. Un module comme wxPython change de version plusieurs fois par an. Il est possible de trouver sur Internet des liens qui donnent des exemples de programme. Une excellente source de documentation sont les forums de discussion qui sont un lieu où des programmeurs échangent questions et réponses. Un message d’erreur entré sur un moteur de recherche Internet permet souvent de tomber sur des échanges de ce type, sur des problèmes résolus par d’autres.

Introduction

Un programme muni d’une interface graphique fonctionne différemment d’un programme classique. Un programme classique est une succession presque linéaire d’instructions.

Il y a un début ou point d’entrée du programme et aucun événement extérieur ne vient troubler son déroulement Avec une interface graphique, le point d’entrée du programme est masqué : il est pris en compte automatiquement. Du point de vue du programmeur, le programme a plusieurs points d’entrée : une simple fenêtre avec deux boutons propose deux façons de commencer et il faut prévoir une action associée à chaque bouton. La conception d’une interface graphique se déroule généralement selon deux étapes. La première consiste à dessiner l’interface, c’est-à-dire choisir une position pour les objets de la fenêtre (bouton, zone de saisie, liste déroulante, ...). La seconde étape définit le fonctionnement de la fenêtre, c’est-à-dire associe à chaque objet des fonctions qui seront exécutées si un tel événement se réalise (pression d’un bouton, pression d’une touche, ...).

Pour le moment, nous allons supposer que ces deux étapes sont scindées même si elles sont parfois entremêlées lorsqu’un événement implique la modification de l’apparence de la fenêtre. Nous allons décrire des objets que propose le module tkinter. Ensuite on présente la manière de les disposer dans une fenêtre et on décrit les événements et le moyen de les relier à des fonctions du programme. Enfin nous allons voir comment gérer des images c’est-à-dire comment dessiner sur la fenêtre, placer des images et les déplacer.

Les fenêtres

Le langage Python dispose d’un module tkinter qui permet d’afficher des fenêtres, des boutons, des images … Voici un exemple de programme simple permettant de créer une fenêtre :

Exemple 1


from tkinter import *
fen = Tk()		# crée la fenêtre nommée fen
fen.mainloop()	# on affiche enfin la fenêtre principal et on attend
				# les événements (souris, clic, clavier) 

On obtient :

exemple1

Comme tous les objets, la fenêtre aura un nom (ici fen) que vous pouvez évidemment changer.

MéthodesEffets
fen.geometry("500×150 ")Redimensionne la fenêtre fen en 500 pixels de large et 150 pixels de haut.
fen.title(T)Affiche le titre T dans la fenêtre.
fen.winfo_width()Renvoie la largeur (interne) de la fenêtre fen.
fen.winfo_height()Renvoie la hauteur (interne) de la fenêtre fen.
fen.resizable(width = False)Empêche le redimensionnement en largeur de la fenêtre fen.
fen.resizable(height = False)Empêche le redimensionnement en hauteur de la fenêtre fen.

Pour cette dernière méthode, on peut placer les deux arguments dans les parenthèses en les séparant par une virgule pour n’utiliser qu’une seule ligne : fen.resizable(width = False, height = False).

Exemple 2


from tkinter import *
fen = Tk()					# crée la fenêtre nommée fen
fen.title ( ' Exemple ' )
fen.geometry( ' 200x100 ')
fen.mainloop()				# on affiche enfin la fenêtre principal et on attend
							# les événements (souris, clic, clavier)

Les fenêtres sont donc des objets sur lesquels on peut définir des fonctions (on dit méthodes). Nous avions déjà vu que Pyscripter permettrait l’affichage d’aide sur les paramètres des fonctions. Pour les objets, cette aide va plus loin puisque le logiciel permet ce que l’on appelle l’auto-complétion.

exemple2

Qu’est-ce que l’auto-complétion ? En réalité, vous l’utilisez sûrement souvent lorsque vous entamez une recherche à l’aide d’un moteur de recherche : alors que vous commencez à taper votre requête, le moteur de recherche cherche dans sa base de questions courantes celles qui peuvent correspondre à ce que vous avez en tête avant même que vous n’ayez fini de la taper.

Avec Pyscripter, nous aurons le même principe : à partir du moment où l’on a déclaré l’objet fen comme étant une fenêtre, le fait d’appuyer sur la touche point déclenche l’ouverture d’un popup (fenêtre surgissante) proposant toutes les méthodes existantes sur l’objet.

Comme vous pouvez le constater, de nombreuses Méthodes apparaissent, nous ne les détaillerons pas toutes. Dans la suite nous verrons comment placer des éléments sur ces fenêtres.