Properties¶
Properties are part of a class and are defined through a
GObject.ParamSpec
, which contains the type, name, value range and so
on.
To find all the registered properties of a class you can use the
GObject.Object.list_properties()
class method.
>>> Gio.Application.list_properties()
[<GParamString 'application-id'>, <GParamFlags 'flags'>, <GParamString
'resource-base-path'>, <GParamBoolean 'is-registered'>, <GParamBoolean
'is-remote'>, <GParamUInt 'inactivity-timeout'>, <GParamObject
'action-group'>, <GParamBoolean 'is-busy'>]
>>> param = Gio.Application.list_properties()[0]
>>> param.name
'application-id'
>>> param.owner_type
<GType GApplication (94881584893168)>
>>> param.value_type
<GType gchararray (64)>
>>>
The GObject.Object
contructor takes multiple properties as keyword
arguments. Property names usually contain “-” for seperating words. In Python
you can either use “-” or “_”. In this case variable names don’t allow “-”, so
we use “_”.
>>> app = Gio.Application(application_id="foo.bar")
To get and set the property value see GObject.Object.get_property()
and
GObject.Object.set_property()
.
>>> app = Gio.Application(application_id="foo.bar")
>>> app
<Gio.Application object at 0x7f7499284fa0 (GApplication at 0x564b571e7c00)>
>>> app.get_property("application_id")
'foo.bar'
>>> app.set_property("application_id", "a.b")
>>> app.get_property("application-id")
'a.b'
>>>
Each instance also has a props
attribute which exposes all properties
as instance attributes:
>>> from gi.repository import Gtk
>>> button = Gtk.Button(label="foo")
>>> button.props.label
'foo'
>>> button.props.label = "bar"
>>> button.get_label()
'bar'
>>>
To track changes of properties, GObject.Object
has a special notify
signal with the property name as the detail string. Note that in this case you
have to give the real property name and replacing “-” with “_” wont work.
>>> app = Gio.Application(application_id="foo.bar")
>>> def my_func(instance, param):
... print("New value %r" % instance.get_property(param.name))
...
>>> app.connect("notify::application-id", my_func)
11L
>>> app.set_property("application-id", "something.different")
New value 'something.different'
>>>
You can define your own properties using the GObject.Property
decorator,
which can be used similarly to the builtin Python property
decorator:
- GObject.Property(type=None, default=None, nick='', blurb='', flags=GObject.ParamFlags.READWRITE, minimum=None, maximum=None)¶
- Parameters:
type (GObject.GType) – Either a GType, a type with a GType or a Python type which maps to a default GType
default (object) – A default value
nick (str) – Property nickname
block (str) – Short description
flags (GObject.ParamFlags) – Property configuration flags
minimum (object) – Minimum value, depends on the type
maximum (object) – Maximum value, depends on the type
class AnotherObject(GObject.Object):
value = 0
@GObject.Property
def prop_pyobj(self):
"""Read only property."""
return object()
@GObject.Property(type=int)
def prop_gint(self):
"""Read-write integer property."""
return self.value
@prop_gint.setter
def prop_gint(self, value):
self.value = value