Exemple minimal PyGObject : passage de la valeur d'une variable entre deux classes ou fenêtres

Jean-Pierre Bucciol

14 sept 2024

Le quatrième exemple minimal dans la programmation d'interfaces graphiques en Python 3, Gtk 3 et PyGObject montre comment passer la valeur d'une variable entre deux classes ou entre deux fenêtres graphiques.

Dans cet exemple, on crée et on initialise dans la première classe/fenêtre la variable var1 à 999. En cliquant sur le bouton Open Second Window, une nouvelle fenêtre s'ouvre et la variable est incrémentée. Pour des raisons d'exemple minimal, les modifications sont uniquement visibles dans le terminal.

medias/2024/09/python-ex-min-4-image-1-f

Cette question est à tel point classique et évidente que... on ne trouve pas facilement d'exemple. Ce qui m'a posé problème ici, et qui a fait qu'il m'a fallu quelque temps pour parvenir à comprendre ce qui se passait, est que les noms souvent choisis pour les classes/fenêtres et leurs étiquettes créent de la confusion, en tout cas pour mon cerveau. Ici la première classe/fenêtre est appelée MainWindow, la deuxième SecondWindow et leur étiquette respective est main et second.

Ainsi dans la deuxième classe/fenêtre, pour rappeler et changer la valeur de la variable que l'on avait notée self.var1 dans la première classe/fenêtre, il suffit d'utiliser main.var1.

#!/usr/bin/env python
# jpsb le 14 sep 2024

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

class MainWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Main Window")

        self.set_default_size(100, 100)
        self.set_border_width(10)

        self.var1 = 999
        print("MainWindow : self.var1 =", self.var1)

        self.button = Gtk.Button(label="Open Second Window")
        self.button.connect("clicked", self.on_main_button_clicked)

        self.add(self.button)

    def on_main_button_clicked(self, widget):

        second = SecondWindow(self)

class SecondWindow(Gtk.Window):
    def __init__(self, parent):
        super().__init__(title="Second Window")

        self.set_default_size(100, 100)
        self.set_border_width(10)
       
        main.var1 = main.var1+1
        print("SecondWindow : main.var1 =", main.var1)
        
        self.show_all()
        
    def on_second_button_clicked(self, widget):
        
        self.destroy()


main = MainWindow()
main.connect("destroy", Gtk.main_quit)
main.show_all()
Gtk.main()

Dans une variante un peu plus riche, on change le contenu d'étiquettes (labels) dans les deux fenêtres.

medias/2024/09/python-ex-min-4-image-2-f

#!/usr/bin/python

"""
Exemple minimal PyGObject :  passage de la valeur d'une variable entre deux classes ou fenêtres. Version avec étiquettes.
jpsb
14 sept 2024
"""

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

class MainWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Main Window")

        self.set_default_size(100, 100)
        self.set_border_width(10)

        self.var1 = 999
        print("MainWindow : self.var1 =", self.var1)

        self.box = Gtk.VBox()

        self.label = Gtk.Label(label=str(self.var1))
        self.box.pack_start(self.label, True, True, 0)

        self.button = Gtk.Button(label="Open Second Window")
        self.button.connect("clicked", self.on_main_button_clicked)
        self.box.pack_end(self.button, False, True, 0)

        self.add(self.box)

    def on_main_button_clicked(self, widget):

        second = SecondWindow(self)

class SecondWindow(Gtk.Window):
    def __init__(self, parent):
        super().__init__(title="Second Window")

        self.set_default_size(100, 100)
        self.set_border_width(10)
       
        main.var1 = main.var1+1
        print("SecondWindow : main.var1 =", main.var1)
        
        self.box = Gtk.VBox()

        self.label = Gtk.Label(label=str(main.var1))
        self.box.pack_start(self.label, True, True, 0)

        self.button = Gtk.Button(label="Close Window")
        self.button.connect("clicked", self.on_second_button_clicked)
        self.box.pack_end(self.button, False, True, 0)

        self.add(self.box)

        self.show_all()
        
    def on_second_button_clicked(self, widget):
        
        main.label.set_text(str(main.var1))
        self.destroy()


main = MainWindow()
main.connect("destroy", Gtk.main_quit)
main.show_all()
Gtk.main()
C'est le cinquième article consacré à la programmation Python, GTK et PyGObject. Les quatre premiers :

← Article précédent
Une horloge analogique en Python, PyGObject et Cairo, août 2024
Article suivant →
Exemple minimal PyGObject : les raccourcis claviers, sep 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