2013-10-05 40 views
3

我想自定义信号添加到一个类 -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__字典,当我说出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

有没有一种方法,我可以通过一个列表是一个信号参数?

+1

尝试TYPE_PYOBJECT。 – XORcist

+0

它的工作原理!使用'object'或'gobject.TYPE_PYOBJECT'。 请你解释一下为什么? –

+1

指定TYPE_PYOBJECT时,可以使用任何Python对象。我猜它基本上代表'任何'。缺点是缺乏类型安全。 – XORcist

回答

2

C库需要知道参数的C类型,对于Gtk,Gdk,Gio和GLib对象,封装器中的类型将在Gtk和家族库中反映C类型时起作用。

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

这也意味着,当然,这个功能并不在Python工作! Python依靠鸭打字,这意味着我们弄清楚,如果一个对象是一个类型,当我们做它的东西,它的工作。传递参数的类型C工作的方式,以确保传递的对象是程序需要他们成为的类型,但是在Python 每个对象都是在C面的相同类型的所以这个功能完全变在python方面没用。

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

用C侧包裹object参数类型的信号处理程序也必然不工作,因为C端需要一个特定类型的功能。

+0

感谢您的详细解释。除了'我们为什么要使用'object''疑问之外,我还学到了很多东西 –

0

在pygtk3这个错误已经发生了我,因为import gobject直接。 并修复了这个错误from gi.repository import GObject。 你可以在这link看到详细信息。