如何将 pygtk Widget 添加到 Glade 调色板?

Ste*_*zzo 9 python programming pygtk application-development

假设我创建了一个这样的 gtk Widget:

class AwesomeTextView (gtk.TextView):

    def set_font(self, font_description):
        self.modify_font(pango.FontDescription(font_description))
Run Code Online (Sandbox Code Playgroud)

如何将我的新小部件添加到 Glade Interface Builder 的调色板中?

在此处输入图片说明

Ste*_*zzo 8

好的,这将是一步一步的:

  • 我们的小部件将被命名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>
    
    Run Code Online (Sandbox Code Playgroud)

    您应该复制并调整此模板,因为它有效。:-)

  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))
    
    Run Code Online (Sandbox Code Playgroud)

    它现在显示在 Glade 中,您可以将它添加到您的应用程序中。

  3. 最后,你只需要

        export PYTHONPATH="$PYTHONPATH:/usr/lib/glade3/modules/"
    
    Run Code Online (Sandbox Code Playgroud)

就是这样!

这是一个小测试应用程序,展示了如何使用您的小部件:

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()
Run Code Online (Sandbox Code Playgroud)

  • 因此,在实践中,据我所知,没有办法轻松地使用代码分发自定义小部件,并让贡献者将其添加到 Glade,而无需在他们的系统上手动安装它。Glade 很棒,可惜的是,如果不深入系统内部,就无法添加自定义小部件。无论如何,很好的答案! (2认同)