3

我正在尝试向类添加自定义信号-

class TaskBrowser(gobject.GObject):
    __list_signal__ = (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (<List datatype>,))
    __gsignals__ = {'tasks-deleted': __list_signal__}

    ...

    def on_delete_tasks(self, widget=None, tid=None):
        ...
        gobject.idle_add(self.emit, "tasks-deleted", deleted_tasks) #deleted_tasks is of type 'list'
        ...

    ...

__gsignals__字典中,当我声明list为参数类型时,我得到以下错误回溯-

File "/home/manhattan/GTG/Hamster_in_hands/GTG/gtk/browser/browser.py", line 61, in <module>
  class TaskBrowser(gobject.GObject):
File "/usr/lib/python2.7/site-packages/gobject/__init__.py", line 60, in __init__
  cls._type_register(cls.__dict__)
File "/usr/lib/python2.7/site-packages/gobject/__init__.py", line 115, in _type_register
  type_register(cls, namespace.get('__gtype_name__'))
TypeError: Error when calling the metaclass bases
  could not get typecode from object

我看到了可能的参数类型列表,但没有类型list

有没有办法可以将列表作为信号参数传递?

4

2 回答 2

3

C 库需要知道参数的 C 类型,对于 Gtk、Gdk、Gio 和 GLib 对象,包装器中的类型将工作,因为它们反映了 Gtk 和族库中的 C 类型。

但是,对于任何其他类型,您需要传递objectgobject.TYPE_PYOBJECT。这意味着在 C 端传递了“python 对象”类型。从 python 脚本访问的每个对象都是这种类型,这几乎意味着你可以通过 python 脚本传递的任何东西都适合一个object参数。

当然,这也意味着此功能在 python 中不起作用!Python 依赖于鸭子类型,这意味着当我们对一个对象进行处理并且它可以工作时,我们会确定它是否属于一种类型。传递参数的类型对于 C 来说是一种确保传递的对象是程序需要它们的类型的方法,但是在 python 中,每个对象在 C 端都是相同的类型,所以这个特性在蟒蛇方面。

但这并不意味着它总体上完全没用。例如,在 pythonint中是一个object. 但不是在 C 中。如果您使用的是在 Gtk 库的 C 端编码的属性绑定,您将需要指定适当的类型,因为不同属性类型的绑定不起作用。

使用带有object参数类型的 C 端包装的信号处理程序也必然不起作用,因为 C 端需要特定类型才能运行。

于 2013-10-21T15:42:14.000 回答
0

在 pygtk3 中,我import gobject直接发生了这个错误。并通过修复此错误from gi.repository import GObject您可以在此链接中查看详细信息。

于 2015-01-21T18:15:50.173 回答