Как добавить виджет Pygtk в палитру Glade?

8

Скажем, я создал виджет GTK, как это:

class AwesomeTextView (gtk.TextView):

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

Как я могу добавить свой новый виджет в палитру в Glade Interface Builder?

введите описание изображения здесь

Стефано Палаццо
источник

Ответы:

7

Хорошо, это будет шаг за шагом:

  • Наш виджет будет назван AwesomeTextView, будет вызван модуль, в котором он находится awesome_text_view. Это единственные имена, которые нам нужны.

Виджет поляны состоит из двух частей: модуля и каталога.

  1. Мы создаем каталог awesome_text_view.xmlи сохраняем его как root/usr/share/glade3/catalogs/

    Вот как это выглядит:

    <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>

    Вам следует скопировать и адаптировать этот шаблон, так как он работает . :-)

  2. Мы создаем модуль awesome_text_view.pyи сохраняем его (снова как root) в/usr/lib/glade3/modules/

    Вот как это выглядит:

    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))

    Теперь он отображается в Glade, и вы можете добавить его в свое приложение.

  3. Наконец, вам просто нужно

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

Это оно!

Вот небольшое тестовое приложение, показывающее, как использовать ваш виджет:

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()
Стефано Палаццо
источник
Таким образом, на практике нет никакого способа легко распространять пользовательский виджет с вашим кодом, и, как я понимаю, разработчики могут добавить его в Glade, не устанавливая его вручную в своих системах. Glade великолепен, жаль, что пользовательские виджеты не могут быть добавлены без необходимости разбираться в системе. В любом случае, хороший ответ!
Дэвид Планелла
Это не работает для меня в 12.04. Glade печатает это: (glade: 25053): GladeUI-WARNING **: не удалось загрузить внешнюю библиотеку 'gladepython'
user1477
1

Вам нужно сделать каталог для ваших виджетов, посмотрите эту папку: /usr/share/glade3/catalogs/и вы увидите gnome.xml, посмотрите пример.

Смотрите также документацию гнома:

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

Мартин Оуэнс -доктормо-
источник
Не работает :-( Кажется, что документация просто неверна, я обновлю свой вопрос. Кроме того, вы имели в виду gtk+.xml, или я просто gnome.xmlпо какой-то причине отсутствует?
Стефано Палаццо
Вы должны сделать свой собственный XML-файл, а не изменять существующий.
Мартин Оуэнс -doctormo-
Я понял это, просто у меня нет gnome.xml, и я подумал, может ли это свидетельствовать о проблеме. Инструкции в ссылке, которую вы разместили, в любом случае неверны, все еще работают над этим :-)
Стефано Палаццо