Gtk.Template
A GtkWidget subclass can use a GtkBuilder UI Definition XML document as a template to create child widgets and set its own properties, without creating a GtkBuilder instance. This is implemented for Python by PyGObject with Gtk.Template.
The subclass uses a @Gtk.Template decorator and declares a class
variable __gtype_name__ with the value of the XML template
element class attribute.
Child widgets are declared, typically with the same names as the XML
object element id attributes, at the class level as instances
of Gtk.Template.Child.
Signal handler methods, typically with the same names as the XML signal
element handler attributes, use the @Gtk.Template.Callback decorator.
Gtk.Template() takes a mandatory keyword argument passing the XML document
or its location, either string, filename or resource_path.
Gtk.Template.Child() and Gtk.Template.Callback() optionally take
a name argument matching the value of the respective XML attribute,
in which case the Python attribute can have a different name.
Examples
xml = """\
<interface>
<template class="example1" parent="GtkBox">
<child>
<object class="GtkButton" id="hello_button">
<property name="label">Hello World</property>
<signal name="clicked" handler="hello_button_clicked" swapped="no" />
</object>
</child>
</template>
</interface>
"""
@Gtk.Template(string=xml)
class Foo(Gtk.Box):
__gtype_name__ = "example1"
hello_button = Gtk.Template.Child()
@Gtk.Template.Callback()
def hello_button_clicked(self, *args):
pass
Python attribute names that are different to the XML values:
@Gtk.Template(string=xml)
class Foo(Gtk.Box):
__gtype_name__ = "example1"
my_button = Gtk.Template.Child("hello_button")
@Gtk.Template.Callback("hello_button_clicked")
def bar(self, *args):
pass
Subclasses that declare __gtype_name__ can be used as objects in the XML:
xml = """\
<interface>
<template class="example3" parent="GtkBox">
<child>
<object class="ExampleButton" id="hello_button">
<property name="label">Hello World</property>
<signal name="clicked" handler="hello_button_clicked" swapped="no" />
</object>
</child>
</template>
</interface>
"""
class HelloButton(Gtk.Button):
__gtype_name__ = "ExampleButton"
@Gtk.Template(string=xml)
class Foo(Gtk.Box):
__gtype_name__ = "example3"
hello_button = Gtk.Template.Child()
@Gtk.Template.Callback()
def hello_button_clicked(self, *args):
pass