我试图向班级添加自定义信号 -
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
有没有办法可以将列表作为信号参数传递?
答案 0 :(得分:3)
C库需要知道参数的C类型,对于Gtk,Gdk,Gio和GLib对象,包装器中的类型将起作用,因为它们镜像Gtk和族库中的C类型。
但是,对于任何其他类型,您需要传递object
或gobject.TYPE_PYOBJECT
。这意味着在C侧传递“python对象”类型。从python脚本可访问的每个对象都属于这种类型,这几乎意味着你可以通过python脚本传递的任何东西都符合object
参数。
当然,这也意味着此功能在python中不起作用! Python依赖于 duck typing ,这意味着当我们对它进行处理并且它有效时,我们会弄清楚对象是否属于某种类型。传递参数的类型适用于C,以确保传递的对象是程序所需的类型,但在python 中,每个对象在C端都是相同的类型所以这个功能在python方面变得毫无用处。
但这并不意味着整体上完全没用。例如,在python中int
是object
。但不在C中。如果您使用的是属性绑定,它们是在Gtk库的C端编码的,那么您将需要指定适当的类型,因为不同属性类型的绑定不起作用。
使用带有object
参数类型的C端包装信号处理程序也不起作用,因为C端需要特定类型才能运行。
答案 1 :(得分:0)
在pygtk3中,这个错误已经发生在我身上,因为直接import gobject
。
并通过from gi.repository import GObject
修正了此错误。
您可以在此link中查看详细信息。