Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Python
  3. tkinter et les interfaces graphiques
Extrait - Python Libérez le potentiel de votre Raspberry Pi
Extraits du livre
Python Libérez le potentiel de votre Raspberry Pi
2 avis
Revenir à la page d'achat du livre

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 :

images/06LF03.png

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é :

images/06LF04.png

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 :

images/06LF05.png

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.