如何将自定义GObject.GEnum类型用作子类属性?
自定义GObject.GEnum作为属性类型的正确实现
要解决TypeError: could not create param spec for type GEnum的问题,核心是确保自定义GEnum被正确注册为GObject可识别的类型,再在__gproperties__中引用。以下是完整实现步骤:
1. 定义并注册自定义GEnum
有两种方式可以创建自定义GEnum类型,任选其一即可:
方式一:类继承式定义
from gi.repository import GObject class NotifWindowState(GObject.GEnum): HIDDEN = 0 TOGGLE = 1
方式二:使用GObject.GEnum.new()创建
from gi.repository import GObject NotifWindowState = GObject.GEnum.new( "NotifWindowState", [("HIDDEN", 0), ("TOGGLE", 1)] )
2. 在GObject子类中使用该枚举作为属性类型
在__gproperties__中直接引用已注册的枚举类型,并实现属性的读写方法:
from gi.repository import Gtk class MyCustomWidget(GObject.Object): __gproperties__ = { "window-state": ( NotifWindowState, "窗口状态属性", "通知窗口的当前状态", NotifWindowState.HIDDEN, # 属性默认值 GObject.ParamFlags.READWRITE # 属性权限 ) } def __init__(self): super().__init__() self._window_state = NotifWindowState.HIDDEN def do_get_property(self, prop): if prop.name == "window-state": return self._window_state raise AttributeError(f"未知属性:{prop.name}") def do_set_property(self, prop, value): if prop.name == "window-state": self._window_state = value raise AttributeError(f"未知属性:{prop.name}") # 注册自定义Widget类 GObject.type_register(MyCustomWidget)
错误原因说明
之前出现报错,是因为自定义GEnum未完成GObject类型注册,导致__gproperties__无法识别该枚举类型。必须确保枚举类型在被属性引用前,已经通过类定义或new()方法完成注册。
内容的提问来源于stack exchange,提问作者Abir Halder
相关产品推荐
相关产品推荐

