1

PythonでのGObjectの使用に関するこのチュートリアルでは、タイプのプロパティの使用についてのみ説明しますgobject.TYPE_FLOAT

列挙型を使用するように調整しました。

import pygtk
pygtk.require('2.0')
import gobject

FUEL_NONE = 0
FUEL_SOME = 1
FUEL_FULL = 2

class Car(gobject.GObject):
  __gproperties__ = {
       'fuel' : (gobject.TYPE_ENUM,                         # type
                 'fuel of the car',                         # nick name
                 'amount of fuel that remains in the tank', # description
                 FUEL_SOME,                                 # default value
                 gobject.PARAM_READWRITE)                   # flags
  }

# <<rest of demo code>>

...しかし、実行しようとすると、次のエラーが発生します。

/usr/lib/pymodules/python2.5/gtk-2.0/gobject/__init__.py:114: Warning: g_param_spec_enum: assertion `g_enum_get_value (enum_class, default_value) != NULL' failed
  type_register(cls, namespace.get('__gtype_name__'))
Traceback (most recent call last):
  File "gcar.py", line 9, in <module>
    class Car(gobject.GObject):
  File "/usr/lib/pymodules/python2.5/gtk-2.0/gobject/__init__.py", line 60, in __init__
    cls._type_register(cls.__dict__)
  File "/usr/lib/pymodules/python2.5/gtk-2.0/gobject/__init__.py", line 114, in _type_register
    type_register(cls, namespace.get('__gtype_name__'))
TypeError: Error when calling the metaclass bases
    could not create param spec for type GEnum (while registering property 'fuel' for GType '__main__+Car')

私は何が欠けていますか?

4

1 に答える 1

1

列挙型である__gproperties__ことを伝えるだけでは十分ではありません。列挙型を GObject 型システムに登録し、そこから取得した GType 値を の代わりに使用する必要があります。少なくとも、それが C で行われている方法です。これを行う適切な方法が PyGTK であるかどうかはわかりませんが、.defs ファイルを作成して実行する必要があるかもしれません。gobject.TYPE_ENUMpygobject-codegen-2.0

もちろん、列挙の詳細を理解するために GObject システムが本当にgobject.TYPE_INT必要でない限り、enum の境界に一致する最小値と最大値を持つ型のプロパティを作成する方がおそらく簡単です。

于 2010-06-29T03:39:19.130 に答える