tkinter et les interfaces graphiques
Présentation de tkinter
tkinter est une librairie très populaire pour le développement Python : elle a l’avantage d’être assez facile à utiliser par rapport à des technologies concurrentes comme QT.
En effet, QT est assez complexe à utiliser avec Python et nécessite de passer par des outils spécifiques pour générer automatiquement du code. De plus, son portage sur Raspbian, et plus généralement sur Raspberry Pi, n’est pas vraiment heureux et nécessite des compétences très avancées, ne serait-ce que pour installer une chaîne de compilation qui fonctionne. C’est pour ces raisons que nous avons écarté QT au profit de tkinter, même si tkinter n’est pas la solution la plus avantageuse pour développer des clients graphiques lourds.
Dans ce chapitre nous ajouterons petit à petit des fonctionnalités dans notre fenêtre graphique pour finir par deux exemples :
-
un visualiseur d’images succinct
-
un datalogger
Mais avant d’examiner les différents composants pouvant être utilisés par tkinter, il est nécessaire de comprendre le fonctionnement global d’une application basée sur tkinter.
Une application tkinter contient a minima une fenêtre principale qui est initialisée grâce à l’instanciation...
Widgets
Dans le jargon tkinter, les composants graphiques d’une fenêtre sont appelés widgets. Dans ce qui suit, les widgets les plus courants sont présentés.
1. Label
Un label affiche du texte dans la fenêtre. C’est une zone non éditable, l’utilisateur ne peut pas modifier ou ajouter du texte.
Pour créer un label, il suffit d’instancier la classe Label, en précisant en argument la fenêtre tk concernée ainsi que le texte du label.
Enfin, il est nécessaire d’appeler la méthode pack() de la classe label pour provoquer l’affichage du label au centre de la fenêtre.
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry('640x480')
label = tk.Label(master=fenetre, text="Hello world!!!")
label.pack()
fenetre.mainloop()
Ce qui provoque l’affichage suivant :
L’objet label possède un grand nombre de propriétés. Il est possible de le positionner grâce à la méthode place(). Le code ci-après place le label à un autre point d’ancrage dans la fenêtre :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry('640x480')
label = tk.Label(master=fenetre, text="Hello world!!!")
label.place(x=20, y=30)
fenetre.mainloop()
Le résultat qui suit montre bien que l’ancrage du label a été modifié :
2. Bouton
Par bouton, on entend les boutons rectangulaires classiques cliquables par l’utilisateur.
Le principe est exactement le même que pour les labels. On instancie un bouton qu’on associe à la fenêtre lors de l’instanciation. Lors de cette phase d’initialisation, on ajoute également le texte que le bouton porte en son sein.
L’affichage du bouton peut se faire soit avec la méthode pack(), soit avec la méthode place(). Le code nécessaire pour insérer un bouton est donc très proche du code d’insertion d’un label :
import tkinter as tk
fenetre = tk.Tk()
bouton = tk.Button(master=fenetre, text='Action')
bouton.pack()
fenetre.mainloop()
Ce qui provoque l’affichage suivant :
Cependant, si l’utilisateur clique sur le bouton, aucune action n’est réalisée....
Visualiseur d’images
Pour créer un visualiseur d’images à l’aide de la librairie tkinter, le procédé est le même : il faut redéfinir grâce à l’héritage la classe tk.Frame :
def __init__(self, master=None):
super(Application, self).__init__(master=master)
self.lire_images()
self.creer_widgets()
self.pack()
Cette redéfinition appelle une première méthode lire_images() qui liste toutes les images d’un répertoire d’images situées dans le même répertoire que le script :
def lire_images(self):
path_images = glob.glob('./images/*.png')
self.images = [Image.open(img) for img in path_images]
self.image_idx = 0
Notez que seules les images .png sont listées.
La deuxième méthode appelée crée les widgets :
def creer_widgets(self):
img = ImageTk.PhotoImage(self.images[self.image_idx])
self.label = tk.Label(self, image=img)
self.label.image = img
self.suivant = tk.Button(self, text='Suivant', ...
Créer un datalogger
Le but ici est de concevoir et de développer une application de datalogging. Ce genre d’application consiste à relever de manière périodique la sortie d’une application ou la sortie d’un capteur.
Ici, afin que tous les lecteurs puissent réaliser cet exemple, l’exemple loggera les données du processeur.
Afin de récupérer les informations du processeur, la librairie psutil est utilisée. Il est nécessaire de l’installer à l’aide de pip :
pip3 install psutil
Comme pour tous les exemples précédents, la classe tk.Frame est dérivée :
class Application(tk.Frame):
def __init__(self, master):
super(Application, self).__init__(master=master)
self.build_gui()
def build_gui(self):
self.grid(column=0, row=0, sticky='ew')
self.grid_columnconfigure(0, weight=1, uniform='a')
self.grid_columnconfigure(1, weight=1, uniform='a')
self.grid_columnconfigure(2, weight=1, uniform='a')
self.grid_columnconfigure(3, weight=1, uniform='a')
self.log_widget = ScrolledText(self, state='disabled') ...
Conclusion
Ce chapitre a permis d’aborder la création d’interfaces graphiques à l’aide de tkinter. Les widgets les plus importants ont été passés en revue. Enfin, deux exemples d’usage ont été donnés : un visualiseur d’images et un datalogger.