[Tutoriel] Glade3 et PyGi
Dans cet article on va comprendre les bases de la crĂ©ation d'une interface utilisateur Ă l'aide de Glade3 (User interface Designer) et PyGi (PyGObject). Ce tutoriel traitera un exemple simple et basique et se sera centrĂ© sur l'appel des mĂ©thodes de PyGi et la maniĂšre de lier un fichier XML gĂ©nĂ©rĂ© par Glade3 et notre code en PyGi. Assez parler! DĂ©butons ... ! CrĂ©ation d'une fenĂȘtre de type Top Level nommĂ©e (son id) Window1:
Modifier l'affichage de la fenĂȘtre et la forcer Ă apparaĂźtre au centre de l'Ă©cran:
Modifier le titre de la fenĂȘtre:
Modifier les dimensions de la fenĂȘtre par dĂ©faut:
Utiliser Grid comme Container (La liste des container est regroupĂ©e sur Glade, mais dans cet exemple on va utiliser uniquement Grid avec une dimension 3x3 nommĂ© Grid1): La fenĂȘtre sera divisĂ©e comme suit:
Notre Grid sera ajouté automatiquement à l'hiérarchie de Window1 :
Dans Grid1 on ajoute ces Widgets listés dans le champs Control and display de Glade3. On aura une interface similaire à cella:
La liste des éléments et leur types ajoutés à Window1 s'affichent comme suit:
On modifie les propriétés de button1 (bouton ajouté à Windows1). On modifie le nom qui s'affiche sur le bouton et on le renomme  Sortir :
On ajoute un signal (événement) à  button1 de type clicked et on lie le signal à la méthode on_button :
On ajoute un signal (événement) à comboboxtext1 de type changed et on lie le signal à la méthode on_comboboxtext :
On ajoute le signal (événement) à checkbutton1 de type toggled et on lie le signal à la méthode on_toggle :
On ajoute le signal (événement) à  entry1 de type activate et on lie le signal à la méthode on_entry_activate:
On ajoute le signal (événement) au searchentry1 et de type activate et on lie le signal à la méthode on_entry_activate:
Le logiciel s'affichera comme suit:
Pour le widget checkbutton1 on va le faire manuellement en modifiant le fichier XML généré par Glade. On va ajouter le signal au child switch1 (qui signifie que switch1 est l'enfant de Window1) comme ceci:
Cette ligne se traduit avec PyGi en:
switch1.connect("notify::active", on_switch_activate)
Ceci dit lier switch1 à un signal de type notify::active (notification active) Sans beaucoup étaler le tutoriel, voilà le fichier XML généré par Glade3 et le code source en PyGi avec des commentaires pour comprendre l'utilisation et le fonctionnement de chaque ligne. Code source du fichier XML de Glade3:
    False   Test Glade3 & PyGi (Python3)   center-always   500   250          True     False                Sortir       True       True       True       top                       0       0       1       1                         True       True                                   1       0       1       1                         True       False       on              NeXus        Nymph        Tristiana        Auroroe        Liturgy                             2       0       1       1                         checkbutton       True       True       False       0       True                       0       1       1       1                         radiobutton       True       True       False       0       True       True                 1       1       1       1                         True       True       Put your text and press Enter                       1       2       2       1                         True       True       edit-find-symbolic       False       False                       2       1       1       1                            Â
Code source en PyGi de l'exemple:Â
#!/user/bin/python # -*- coding: utf-8 -*- ################################################################### # Exemple mis en ligne par: Chiheb NeXus # Licence : Aucune licence! # Langage de programmation: Python3 et PyGi (PyGtk Version 3) ################################################################### from gi.repository import Gtk class Handler(): """ - Mettre tous les signaux dans une seule classe - NB: Dans PyGi les argements des mĂ©thodes sont des widgets intermĂ©diaires qui hĂ©ritent toutes les caractĂ©ristiques des widgets d'origine. Ceci dit, si on essaye de donner une action Ă un widget de type "button" nommĂ© "button1" dans la partie du code on Ă©crit: def action(self, intermerdiare): intermerdiare hĂ©rite toutes les caractĂ©ristiques de button1 et l'action sur intermerdiare est une action indirecte sur button1 Ceci est peut ĂȘtre bien expliquĂ© en C/GTK+ vu que PyGi est en quelques sorte un porjet rĂ©ecrit depuis C/GTK+. - Ps: Lors d'une utilisation avancĂ©e de PyGi, les signaux jouent un rĂŽle primordial dans la crĂ©ation de notre Gui. C'est pourquoi une maĂźtrise de l'utilisation des signaux est fortement rĂ©commendĂ©e et, aussi, la modification du ficher XML gĂ©nĂ©rĂ© par Glade3 est, aussi, rĂ©commendĂ©e. - Dans cet exemple, notre programme principale n'est pas mis dans une classe Ă part, vu sa simplicitĂ©. Mais, dans un programme avancĂ©, une bonne maĂźtrise de Python et de PyGi est nĂ©cessaire. Glade3 ne permet que rĂ©duire le temps de crĂ©ation de Gui et Ă©viter la crĂ©ation de l'interface Ă la main. Cependant, ceci ne veut pas dire qu'on va oublier les manipulations manuelles pour parvenir aux rĂ©sultas voulus. - Documentation sur Github: 1- Toutes les mĂ©thodes Gtk.methodes (exemple: Gtk.main_quit()) https://lazka.github.io/pgi-docs/#Gtk-3.0/functions.html 2- Les mĂ©thodes supportĂ©es par Gtk.Button() {Comment interĂ©agir avec les widgets de type Gtk.Button()} https://lazka.github.io/pgi-docs/#Gtk-3.0/classes/Button.html#Gtk.Button 3- Les mĂ©thodes supportĂ©es par Gtk.Entry() {Comment interĂ©agir avec les widgets de type Gtk.Entry()} https://lazka.github.io/pgi-docs/#Gtk-3.0/classes/Entry.html#Gtk.Entry 4- Les mĂ©thodes supportĂ©es par Gtk.Switch() {Comment interĂ©agir avec les widgets de type Gtk.Switch()} https://lazka.github.io/pgi-docs/#Gtk-3.0/classes/Switch.html#Gtk.Switch 5- Les mĂ©thodes supportĂ©es par Gtk.ComboBoxText() {Comment interĂ©agir avec les widgets de type Gtk.ComboBoxText()} https://lazka.github.io/pgi-docs/#Gtk-3.0/classes/ComboBoxText.html#Gtk.ComboBoxText 6- Les mĂ©thodes supportĂ©es par Gtk.ToggleButton() {Comment interĂ©agir avec les widgets de type Gtk.ToggleButton()} https://lazka.github.io/pgi-docs/#Gtk-3.0/classes/ToggleButton.html#Gtk.ToggleButton 7- Les mĂ©thodes supportĂ©es par Gtk.SearchEntry() {Comment interĂ©agir avec les widgets de type Gtk.SearchEntry()} https://lazka.github.io/pgi-docs/#RB-3.0/classes/SearchEntry.html#RB.SearchEntry - Pour plus d'informations: https://lazka.github.io/pgi-docs/ """ def on_button(self, button): """ - Gtk.main_quit(): Est une fonction par dĂ©faut de PyGi qui permet de sortir de la boucle infinie de l'interface en Gtk+ en utilisant Python - La mĂ©thode utilise le mot "self" et "button" comme arguments - "button" joue le rĂŽle d'un widget intermĂ©diaire entre button1 et cette partie de code """ Gtk.main_quit() def on_switch_activate(self, switch, args): """ - "switch" est un widget intermĂ©diaire entre "switch1" et cette partie de code et args est l'argument passĂ© Ă la mĂ©thode lors de l'appel de widget "switch1" - switch.get_active() : Cette mĂ©thode retourne "True" ou "False" => "True" = Le bouton (widget) est actif / "False" = Le bouton (widget) est inactif """ if switch.get_active(): # Bouton actif print("Switch activĂ©!") else: # L'inverse print("Switch dĂ©sactivĂ©!") def on_comboboxtext(self, combobox): """ - L'ajout des Ă©lĂ©ments Ă ComboBoxText est faite sous Glade3 - Cette mĂ©thode affichera uniquement les noms stockĂ©s dans le fichier XML gĂ©nĂ©rĂ©e par Glade3 - combobox.get_active_text() : Retourne le text activĂ© de widget ComboBoxText lors de la saisie dans l'interface UI Le type de retour est une chaine de caractaire (String) et l'affiche sera sous la terminale """ # On vĂ©rifie si combobox est vide ou non. # S'il est vide, il n'y aura aucun affichage sinon on affiche le contenu if combobox.get_active_text() != None: print("L'Ă©lĂ©ment saisi est: " + combobox.get_active_text()) def on_toggle(self, toggle): """ - Le bouton "toggle1" affiche sur la terminale "Toggle button est activĂ©!" ou "Toggle button est dĂ©sactivĂ©" - toggle.get_active() : Retourne "True" ou "False" et qui permet de vĂ©rifier l'Ă©tat de widget (activĂ© ou non) - L'affiche est sous la terminale """ if toggle.get_active(): print("Toggle button est activĂ©!") else: print("Toggle button est dĂ©sactivĂ©") def on_entry_activate(self, entry): """ - Affichage du text saisi dans "entry1" et "seachentry1" - entry est un widget intermĂ©diaire entre "entry1" et "seachentry1" - entry.get_text(): Retourne le text entrĂ© dans "entry1" et "seachentry1" - L'affiche sera sur la terminale """ txt = entry.get_text() print(txt) #builder est de type Gtk.Builder() : Notre constructeur du fichier XML de Glade builder = Gtk.Builder() # Ajouter le chemin de fichier d'interface gĂ©nĂ©rĂ©e par Glade builder.add_from_file("test.glade") # Tous les signaus sont mis dans une classe nommĂ©e Handler() builder.connect_signals(Handler()) # window est un objet qui hĂ©rite toutes les mĂ©thodes de window1 window = builder.get_object("window1") # Affichage de la fenĂȘtre window = Affichage de la fenĂȘtre window1 window.show_all() # Lier la fenĂȘtre principale Ă un signal de destruction de la fenĂȘtre window.connect("delete-event",Gtk.main_quit) # Lancer la boucle infinie qui permettera de visualiser l'interface indĂ©finiment sauf s'il y aura une intervention # de l'utilisateur ou du programme interne Gtk.main()Â
Code source: GladePyGi














