PyGTK自定义信号发送列表作为参数

时间:2013-10-05 16:22:01

标签: python gtk pygtk

我试图向班级添加自定义信号 -

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__ dict中,当我将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

我看到了possible parameter types的列表,list

没有类型

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

2 个答案:

答案 0 :(得分:3)

C库需要知道参数的C类型,对于Gtk,Gdk,Gio和GLib对象,包装器中的类型将起作用,因为它们镜像Gtk和族库中的C类型。

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

当然,这也意味着此功能在python中不起作用! Python依赖于 duck typing ,这意味着当我们对它进行处理并且它有效时,我们会弄清楚对象是否属于某种类型。传递参数的类型适用于C,以确保传递的对象是程序所需的类型,但在python 中,每个对象在C端都是相同的类型所以这个功能在python方面变得毫无用处。

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

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

答案 1 :(得分:0)

在pygtk3中,这个错误已经发生在我身上,因为直接import gobject。 并通过from gi.repository import GObject修正了此错误。 您可以在此link中查看详细信息。