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 (304)
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 :