Python PyGTK自定义信号将列表作为参数发送
我正在尝试向类添加自定义信号-Python PyGTK自定义信号将列表作为参数发送,python,gtk,pygtk,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=Non
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'
...
...
我看到了的列表,没有list
有什么方法可以将列表作为信号参数传递吗?C库需要知道参数的C类型,对于Gtk、Gdk、Gio和GLib对象,包装器中的类型将在它们镜像Gtk和族库中的C类型时起作用 但是,对于任何其他类型,您需要传递
object
或gobject.type_PYOBJECT
。这意味着在C端传递一个“python对象”类型。python脚本中可访问的每个对象都是这种类型的,这几乎意味着您可以通过python脚本传递的任何对象都将适合一个object
参数
当然,这也意味着这个特性在python中不起作用!Python依赖于duck类型,这意味着当我们处理一个对象并使其工作时,我们会判断它是否属于某个类型。传递参数的类型对于C来说是一种确保传递的对象是程序需要的类型的方法,但是在python中,每个对象在C端都是相同的类型,因此这个特性在python端完全没有用处
但这并不意味着它总体上是完全无用的。例如,在python中,int
是一个对象
。但不是在C中。如果您使用的是在Gtk库的C端编码的属性绑定,则需要指定适当的类型,因为不同属性类型的绑定不起作用
将C端包装的信号处理程序与
对象
参数类型一起使用也注定不起作用,因为C端需要一种特定类型才能工作。在pygtk3中,我发生了此错误,因为直接导入gobject。
并通过从gi.repository import GObject中修复了此错误。
您可以在此中查看详细信息。它可以正常工作!使用object
或gobject.TYPE_PYOBJECT
。请您解释一下为什么?在指定类型_PYOBJECT时,您可以使用任何Python对象。我猜它基本上代表“任何东西”。缺点是缺乏类型安全性。感谢您的详细解释。除了“我们为什么要使用对象
”之外,我还学到了很多东西
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