Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyGTK自定义信号将列表作为参数发送_Python_Gtk_Pygtk - Fatal编程技术网

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