You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:42:40