通过创建ParamSp安装PyGObject子属性

2024-06-01 04:32:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试转换一个名为pygtk的库etk.停靠到pygobject。作为这一部分,我有一个Gtk.Container类,它在__gchild_properties__字典中定义了子属性。这些对象属性不是特定于容器或包含的小部件,而是特定于关系。库还使用它连接到子小部件通知,以更新属性值。你知道吗

__gchild_properties__ = {
    'weight': (GObject.TYPE_FLOAT,
               'item weight',
               'item weight',
               0,  # min
               1,  # max
               .2,  # default
               GObject.ParamFlags.READWRITE
               ),
}

然后我尝试在上面的字典上使用这个for循环来安装子属性(DockPanedContainer):

for index, (name, pspec) in enumerate(six.iteritems(DockPaned.__gchild_properties__)):
    pspec = list(pspec)
    pspec.insert(0, name)
    Gtk.ContainerClass.install_child_property(DockPaned, index + 1, tuple(pspec))

从最后一行我得到一个

TypeError: argument pspec: Expected GObject.ParamSpec, but got tuple

我知道内置的GObject类属性使用GObject。ParamSpec作为保存属性的对象结构。我在PyGObject中没有看到创建自己的ParamSpec的方法。你知道吗

对于普通属性,《PyGObject用户指南》使用GObject.Property作为装饰符来创建新属性。Python GTK+3 Tutorial还显示了使用GObject.Property作为构造函数来创建属性,还显示了它作为装饰器和详细字典形式的用法。但是,没有提到子属性。你知道吗

我尝试过的事情:

  1. 在为GObject.ParamSpec构造函数搜索API(pgi docs)时,我不知道如何创建一个构造函数,除非我首先在C中创建它作为一个结构,然后以某种方式将它传递回pygobject。你知道吗
  2. 将此权重属性直接定义到子对象。这不起作用,因为我得到的错误是子属性不存在,因为子属性与应用于子对象的属性不同。你知道吗
  3. 在API中搜索install_child_property的任何不需要ParamSpec的替代项,以便使用我定义的元组。你知道吗

Tags: 对象gtk字典属性定义部件containerproperties