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.
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.
#!/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 :
Articles (313)
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 :