IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec Python Discussion :

Utilisation de Glade 3.40 avec Python 3.10.6 sous Linux


Sujet :

GTK+ avec Python

  1. #1
    Membre du Club Avatar de zardoz45
    Homme Profil pro
    Chef de projet en SSII, retraité
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII, retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Points : 57
    Points
    57
    Par défaut Utilisation de Glade 3.40 avec Python 3.10.6 sous Linux
    bonjour,
    Après une expérience de développement d'une application Python avec tKinter, j'ai tenté ces dernières semaines d'utiliser Glade et Gtk+.
    Sous Linux Mint 21.1, avec Python en version 3.10.6, j'ai installé Glade en version 3.40 Flathub.

    J'ai créé une IHM simpliste dans Glade, avec un GtkWindow, GtkFixed, GtkButton et GtkLabel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Generated with glade 3.40.0 -->
    <interface>
      <requires lib="gtk+" version="3.24"/>
      <object class="GtkWindow" id="myWin01">
    	<property name="can-focus">False</property>
    	<child>
    	  <object class="GtkFixed">
    		<property name="visible">True</property>
    		<property name="can-focus">False</property>
    		<child>
    		  <object class="GtkButton" id="myW01Butt01">
    			<property name="label" translatable="yes">Vas-y clique</property>
    			<property name="width-request">100</property>
    			<property name="height-request">80</property>
    			<property name="visible">True</property>
    			<property name="can-focus">True</property>
    			<property name="receives-default">True</property>
    			<signal name="clicked" handler="on_myW01Butt01_clicked" swapped="no"/>
    		  </object>
    		  <packing>
    			<property name="x">172</property>
    			<property name="y">14</property>
    		  </packing>
    		</child>
    		<child>
    		  <object class="GtkLabel" id="myW01Lab01">
    			<property name="width-request">100</property>
    			<property name="height-request">80</property>
    			<property name="visible">True</property>
    			<property name="can-focus">False</property>
    			<property name="label" translatable="yes">label</property>
    		  </object>
    		  <packing>
    			<property name="x">173</property>
    			<property name="y">117</property>
    		  </packing>
    		</child>
    	  </object>
    	</child>
      </object>
    </interface>
    Et j'ai essayé d'afficher cette IHM dans un module Python, inspiré des exemples trouvés dans mes recherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/usr/bin/python3.10
    # -*- coding: utf-8 -*-
    import gi
    gi.require_version("Gtk", "4.0")
    from gi.repository import Gtk
     
    class MyFirstGlade:
    	def __init__(self):
    		interface = Gtk.Builder()
    		interface.add_from_file('MyFirstGlade.glade')
     
    		self.myW01Lab01 = interface.get_object("myW01Lab01")
    		interface.connect_signals(self)
     
    	def on_mainWindow_destroy(self, widget):
    		gtk.main_quit()
     
    	def on_myW01Butt01_clicked(self, widget):
    		self.myW01Lab01.set_text("coucou c'est moi")
     
    if __name__ == "__main__":
    	 MyFirstGlade()
    	 Gtk.main()
    Je rencontre une erreur à l'exécution qui porte sur la section <packing>, qui définit la position des widgets dans le fichier .glade.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    python3 "MyFirstGlade.py"
    Traceback (most recent call last):
      File "/home/zardoz/01 Leviia/85 Développement VBA VBS Python/90 Python/Apprentissage Glade/MyFirstGlade.py", line 23, in <module>
    	MyFirstGlade()
      File "/home/zardoz/01 Leviia/85 Développement VBA VBS Python/90 Python/Apprentissage Glade/MyFirstGlade.py", line 11, in __init__
    	interface.add_from_file('MyFirstGlade.glade')
    gi.repository.GLib.GError: gtk-builder-error-quark: No function named `on_myW01Butt01_clicked`. (14)
    Sur cette erreur, quelques forums évoque une incompatibilité entre Python 3.10 et GTK 4.0.
    Si je modifie mon source Python pour mette en cohérence le contrôle de version GTK avec [requires lib="gtk+" version="3.24"] du fichier .glade, le programme Python reste bloqué dans le terminal, interrompu par Ctrl+C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    python3 "MyFirstGlade.py"
        Traceback (most recent call last):
          File "/home/zardoz/01 Leviia/85 Développement VBA VBS Python/90 Python/Apprentissage Glade/MyFirstGlade.py", line 24, in <module>
            Gtk.main()
          File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 1687, in main
            with register_sigint_fallback(Gtk.main_quit):
          File "/usr/lib/python3.10/contextlib.py", line 142, in __exit__
            next(self.gen)
          File "/usr/lib/python3/dist-packages/gi/_ossighelper.py", line 237, in register_sigint_fallback
            signal.default_int_handler(signal.SIGINT, None)
        KeyboardInterrupt
    Faut-il utiliser une autre version de Glade, une autre version de GTK ?
    Merci de votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Bonjour

    Par curiosité j'ai testé votre code. A l'arrache voici une version qui semble fonctionner.
    Notez que j'ai mis gi.require_version("Gtk", "3.0") au lieu de 4.0.
    4.0 ne fonctionne pas pour moi, je dois sûrement installer des packages. Mais comme votre formulaire mentionne ceci: <requires lib="gtk+" version="3.24"/> j'imagine que c'est bien du GTK3.0 que vous essayez de coder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #!/usr/bin/env python3
     
    import gi
     
    gi.require_version("Gtk", "3.0")
     
    from gi.repository import Gtk
     
    UI_FILE = 'MyFirstGlade.glade'
     
     
    class Example:
        def __init__(self, ui_file):
            self.builder = Gtk.Builder()
            self.builder.add_from_file(ui_file)
            self.builder.connect_signals(self)
     
            self.myWin01 = self.builder.get_object("myWin01")
            self.myW01Lab01 = self.builder.get_object("myW01Lab01")
            self.myWin01.show_all()
     
        def on_myW01Butt01_clicked(self, button): # widget):
            self.myW01Lab01.set_text("coucou c'est moi")
     
        def on_window_destroy(self, window):
            Gtk.main_quit()
     
     
    def main():
        app = Example(ui_file=UI_FILE)
        Gtk.main()
     
     
    if __name__ == "__main__":
        main()
    Nom : test3.png
Affichages : 190
Taille : 10,2 Ko

    J'ai zéro expérience en GTK, j'ai juste testé une fois avec Glade et j'ai adapté mon code à votre formulaire. Je ne garantis pas que c'est du bon code, il faudrait que je relise des tutos. Mais peut-être que ça va marcher chez vous et que vous pouvez améliorer cette ébauche.

    NB: si je clique sur la croix dans le coin supérieur droit de la fenêtre l'application ne se ferme pas, du moins pas chez moi.

  3. #3
    Membre du Club Avatar de zardoz45
    Homme Profil pro
    Chef de projet en SSII, retraité
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII, retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Points : 57
    Points
    57
    Par défaut
    bonjour,
    La proposition de binarygirl m'a permis de comprendre ... merci
    Il manquait, dans la fonction __init___ de mon source Python, l'instanciation de la fenêtre principale et l'instruction d'affichage de cette fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.myWin01 = interface.get_object("myWin01")
    self.myWin01.show_all()
    Par ailleurs, pour l'import gi, il faut spécifier la version 3.0 de Gtk (en cohérence avec le fichier .glade) et non 4.0 comme je l'avais essayé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import gi
    gi.require_version("Gtk", "3.0")
    Le script Python corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/python3.10
    # -*- coding: utf-8 -*-
     
    import gi
    gi.require_version("Gtk", "3.0")
    from gi.repository  import Gtk
     
     
    class MyFirstGlade:
        def __init__(self):
            interface = Gtk.Builder()
            interface.add_from_file('MyFirstGlade.glade')
     
            self.myWin01 = interface.get_object("myWin01")
            self.myW01Lab01 = interface.get_object("myW01Lab01")
            interface.connect_signals(self)
            self.myWin01.show_all()
     
        def myWin01_destroy_cb(self, widget):
            Gtk.main_quit()
     
        def on_myW01Butt01_clicked(self, widget):
            self.myW01Lab01.set_text("coucou c'est moi")
     
     
    if __name__ == "__main__":
         MyFirstGlade()
         Gtk.main()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'un fichier OCX avec Python
    Par yoyo29 dans le forum Interfaçage autre langage
    Réponses: 1
    Dernier message: 10/03/2010, 15h28
  2. Problème avec mon écran 19 pouces sous Linux
    Par Flomyr dans le forum Matériel
    Réponses: 2
    Dernier message: 17/01/2008, 20h26
  3. Réponses: 12
    Dernier message: 24/09/2007, 23h15
  4. Réponses: 11
    Dernier message: 14/02/2006, 00h26
  5. bizarrerie avec l'appel system read sous linux.
    Par Hypnocrate dans le forum C
    Réponses: 20
    Dernier message: 20/11/2005, 02h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo