Comment ajouter un widget pygtk à la palette Glade?

8

Disons que j'ai créé un widget gtk comme celui-ci:

class AwesomeTextView (gtk.TextView):

    def set_font(self, font_description):
        self.modify_font(pango.FontDescription(font_description))

Comment puis-je ajouter mon nouveau widget à la palette dans Glade Interface Builder?

entrez la description de l'image ici

Stefano Palazzo
la source

Réponses:

7

D'accord, cela va se faire étape par étape:

  • Notre widget va être nommé AwesomeTextView, le module dans lequel il se trouvera sera appelé awesome_text_view. Ce sont les seuls noms dont nous avons besoin.

Un widget clairière se compose de deux parties, le module et le catalogue.

  1. Nous créons un catalogue, awesome_text_view.xmlet (en tant que root) l'enregistrons sur/usr/share/glade3/catalogs/

    Voici à quoi ça ressemble:

    <glade-catalog name="awesome_text_view"
        library="gladepython"
        domain="glade-3"
        depends="gtk+">
    
     <init-function>glade_python_init</init-function>
    
     <glade-widget-classes>
       <glade-widget-class title="Awesome TextView"
        name="AwesomeTextView"
        generic-name="awesome_text_view"/>
     </glade-widget-classes>
    
     <glade-widget-group name="python" title="Python">
       <glade-widget-class-ref name="AwesomeTextView"/>
     </glade-widget-group>
    </glade-catalog>

    Vous devez copier et adapter ce modèle, car il fonctionne . :-)

  2. Nous créons un module, awesome_text_view.pyet (à nouveau en tant que root) l'enregistrons à/usr/lib/glade3/modules/

    Voici à quoi cela ressemble:

    import gobject
    import gtk
    import pango
    
    
    class AwesomeTextView (gtk.TextView):
    
        __gtype_name__ = 'AwesomeTextView'
    
        def __init__(self):
            gtk.TextView.__init__(self)
    
        def set_font(self, font_description):
            self.modify_font(pango.FontDescription(font_description))

    Il est maintenant affiché dans Glade et vous pouvez l'ajouter à votre application.

  3. Enfin, vous aurez juste besoin de

        export PYTHONPATH="$PYTHONPATH:/usr/lib/glade3/modules/"

C'est ça!

Voici une petite application de test montrant comment utiliser votre widget:

import gtk
import awesome_text_view

class App (object):

    builder = gtk.Builder()

    def __init__(self):
        self.builder.add_from_file("test.glade")
        self.builder.connect_signals(self)
        self.builder.get_object("awesome_text_view1").set_font("mono")
        gtk.main()

    def on_window1_destroy(self, widget):
        gtk.main_quit()


App()
Stefano Palazzo
la source
Donc, dans la pratique, il n'y a aucun moyen de distribuer facilement le widget personnalisé avec votre code et de laisser les contributeurs l'ajouter à Glade sans qu'ils aient à l'installer manuellement sur leurs systèmes, je comprends. Glade est génial, dommage que des widgets personnalisés ne puissent pas être ajoutés sans avoir à entrer dans les tripes du système. En tout cas, belle réponse!
David Planella
Cela ne fonctionne pas pour moi en 12.04. Glade imprime ceci: (glade: 25053): GladeUI-WARNING **: Échec du chargement de la bibliothèque externe 'gladepython'
user1477
1

Vous devez faire un catalogue pour vos widgets, voir ce dossier: /usr/share/glade3/catalogs/et vous verrez gnome.xml, regardez un exemple.

Voir aussi la documentation de gnome:

http://developer.gnome.org/gladeui/stable/catalogintro.html

Martin Owens -doctormo-
la source
Ne fonctionne pas :-( Il semble que la documentation est tout simplement erronée, je vais mettre à jour ma question. Aussi, vouliez-vous dire gtk+.xml, ou suis-je simplement absent gnome.xmlpour une raison quelconque?
Stefano Palazzo
Vous devez créer votre propre fichier xml, pas en modifier un existant.
Martin Owens -doctormo-
J'ai compris cela, c'est juste que je n'ai pas gnome.xml, et je me suis demandé si cela pouvait indiquer un problème. Les instructions dans le lien que vous avez posté sont de toute façon erronées, y travaillant toujours :-)
Stefano Palazzo