PyGTK 属性与 Python 属性

2 投票
2 回答
663 浏览
提问于 2025-04-16 17:26

在使用PyGTK从GObject类派生时,你可以像在C语言中那样定义GObject属性,方法是使用一个叫做__gproperties__的字典,以及do_get_propertydo_set_property这两个方法。具体的内容可以参考这里的在Python中子类化GObject。需要注意的是,这段内容是在Python有@property装饰器之前写的。

GObject属性的一个好处是,你可以连接到对象的notify::property-name信号,这样每当属性发生变化时,你就会收到通知。除此之外,还有什么好的理由让我们使用GObject属性,而不是Python的@property装饰器呢?

2 个回答

1

除了这个,还有什么好理由让我们用GObject的属性,而不是Python的@property装饰器吗?

其实没有什么特别的理由。使用GObject属性需要写很多重复的代码,所以除非我需要用到notify信号,我通常会直接在Python里写我需要的东西。

不过,我常常会想“这个属性我不需要通知”,然后突然意识到“其实,我根本不需要这个属性。”

1

为什么不使用它们呢?通过Python的绑定提供的简化版本,定义GObject属性和定义Python属性其实没什么太大区别。

不过,除了通知功能,还有一些其他的好处。我过去用过的一个好处是可以在gtk.Builder文件中设置属性。例如,在你的用户界面文件中,

<object class="GtkImage" id="image">
  <property name="stock">gtk-missing-image</property>
</object>

当Builder类构建Image对象时,它会设置stock属性;如果你在自定义小部件中使用GObject属性,你也可以利用这一点。随着Glade中对属性绑定支持的出现,这种行为会变得更加有用。

另一个潜在的好处是GObject属性可以设置整数和浮点数的最小值和最大值,以及默认值,这在与用户界面相关的属性中有时会很有用。

撰写回答