Exemple minimal PyGObject : mise-à-jour d'une étiquette

Jean-Pierre Bucciol

3 août 2024

Quand on apprend en solitaire la programmation d'interfaces graphiques en Python 3, Gtk 3 et PyGObject, on tombe nécessairement, souvent, et pendant plusieurs jours, sur des blocages. On ne trouve pas la réponse à certaines questions que l'on se pose, questions souvent très simples, malgré les nombreuses documentations et les bons tutoriaux que l'on trouve sur l'internet. Étant très sensible à la notion d'exemple minimal dans les apprentissages, je donne ici sous cette forme quelques clés qui m'ont permis de passer ces blocages.

Le premier est particulièrement trivial : comment met-on à jour une étiquette (label) dans une interface graphique ?

medias/2024/08/20240803-pygobject-label-update-f

Dans cet exemple, on affiche l'heure courante dans une étiquette de la fenêtre, et l'étiquette est mise à jour toutes les secondes : il s'agit donc d'une horloge numérique.

#!/usr/bin/python

"""
Exemple minimal PyGObject : mise-à-jour d'une étiquette
jpsb
3 août 2024
"""

# ----------------------------------------------------
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib
import time

# ----------------------------------------------------
class Example(Gtk.Window):

    # ----------------------------------------------------
    def __init__(self):

        super().__init__(title="Une étiquette")

        self.set_size_request (200, 200);

        self.label = Gtk.Label()

        self.add(self.label)

        self.update()

    # ----------------------------------------------------
    def update(self):

        self.label.set_text(time.strftime("%H:%M:%S"))

        GLib.timeout_add_seconds(1, self.update)

# ----------------------------------------------------
win = Example()
win.connect("destroy", Gtk.main_quit)
win.show_all()

Gtk.main()

Sans rien connaître à la programmation-objet il y a encore trois semaines, chacune des parties des exemples lus était compréhensible, mais le tout l'était moins. Quel était donc le rôle de ces self. qui précédaient la plupart des commandes et des variables ? Ils indiquaient bien sûr leur appartenance à la classe de la fenêtre Example. Mais pourquoi ne passait-on pas d'argument à la fonction self.update() et pourquoi celle-ci ne renvoyait-elle pas la nouvelle valeur de l'étiquette avec un return ? J'ai fini par comprendre que le self. permet de partager toutes les informations de la classe avec toutes ses méthodes. C'est donc ces self. qui permettent de mettre à jour l'étiquette self.label.

La deuxième chose incompréhensible pour moi était pourquoi la commande GLib.timeout_add_seconds(1, self.update), qui permet de relancer la mise-à-jour toutes les secondes, ne pose pas de problème de limites de récursivité. J'ai compris qu'il ne s'agissait pas d'un appel de la fonction dans elle-même, mais seulement de la mise en attente du prochain appel de la fonction... Et donc qu'il n'y avait aucune récursivité là-dedans.

Deux très bons tutoriaux dont j'ai abondamment réutilisés les exemples :

← Article précédent
2500 km avec le Winspace G2, juil 2024
Article suivant →
Exemple minimal PyGObject et Cairo : tracé d'une ligne, août 2024

Je préfère vraiment les contacts à l'ancienne, par courrier électronique à l’adresse jpsmail(at)free.fr. Antispam : penseras-tu à remplacer (at) par @ dans l’adresse ? Que cela ne t'enpêche pas d'ajouter un commentaire :

Nom :

Commentaire :

Articles (304)

   (*: nécessite un mot de passe.)
↑ Retour en haut de la page