Python中如何向GObject类型模块正确注册枚举类型
将Perl Gtk3枚举注册逻辑移植到Python的实现方案
问题背景
我正在尝试将现有Perl代码移植到Python,原始Perl实现代码如下:
package My::Package; use strict; use warnings; use Gtk3 -init; BEGIN { Glib::Type->register_enum( 'My::Package::Enum', qw(value_one value_two) ); } use Glib::Object::Subclass Gtk3::Window::, properties => [ Glib::ParamSpec->enum('my_enum', 'nick', 'blurb', 'My::Package::Enum', 'value_one', [qw/readable writable/]), ]; package main; my $window = My::Package->new; print $window->get('my_enum'), "\n";
我编写的对应Python代码如下:
import gi from gi.repository import GObject gi.require_version("Gtk", "3.0") from gi.repository import Gtk GObject.TypeModule.register_enum( 'MyPackageEnum', ["value_one","value_two"] ) class MyPackage(Gtk.Window): my_enum=GObject.Property(type=MyPackageEnum,default='value_one',nick='nick',blurb='blurb') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) window = MyPackage() print(window.get_property('my_enum'))
运行上述代码时产生如下报错:
Traceback (most recent call last): File "my_enum.py", line 6, in <module> GObject.TypeModule.register_enum( 'MyPackageEnum', ["value_one","value_two"] ) TypeError: GObject.TypeModule.register_enum() takes exactly 3 arguments (2 given)
我猜测报错原因是调用方法时缺少self参数,希望能得到相关帮助,找到正确的枚举注册实现方式。
报错原因
你对报错原因的猜测是对的:GObject.TypeModule.register_enum是实例绑定方法,必须在TypeModule实例上调用,不能直接通过类调用,这个接口本身是给GObject动态类型插件设计的,普通应用层代码不需要用这个接口注册枚举。
正确实现方式
PyGObject提供了更简单的枚举注册方式:直接继承GObject.GEnum类定义枚举类型即可,框架会自动完成类型注册,不需要手动调用任何注册方法。
修正后的完整可运行代码如下:
import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject, Gtk # 自定义枚举继承GObject.GEnum,自动完成GType注册 class MyPackageEnum(GObject.GEnum): VALUE_ONE = 1 VALUE_TWO = 2 class MyPackage(Gtk.Window): my_enum = GObject.Property( type=MyPackageEnum, default=MyPackageEnum.VALUE_ONE, nick='nick', blurb='blurb', flags=GObject.ParamFlags.READWRITE ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) window = MyPackage() print(window.get_property('my_enum'))
注意事项
- GObject枚举成员命名惯例为大写下划线格式,底层存储为整数类型,需要和原Perl逻辑对齐时直接调整成员对应的整数值即可
- 定义GObject属性时,枚举类型直接传入自定义的枚举类,默认值传入枚举成员实例,不要传字符串避免类型校验失败
- 原Perl代码中属性的
readable writable权限,在Python中通过flags=GObject.ParamFlags.READWRITE显式指定,默认属性权限就是可读可写,不手动加也能正常运行
内容的提问来源于stack exchange,提问作者DobbyTheElf
相关产品推荐
相关产品推荐

