其他分享
首页 > 其他分享> > PyGTK自定义信号将列表作为参数发送

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__字典中,当我将列表声明为参数类型时,我得到以下错误回溯-

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的列表,列表没有类型

有什么方法可以将列表作为信号参数传递?

解决方法:

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

但是,对于任何其他类型,您都需要传递object或gobject.TYPE_PYOBJECT.这意味着在C端传递了“ python对象”类型.从python脚本访问的每个对象都是该类型的,这几乎意味着您可以通过python脚本传递的任何内容都将适合对象参数.

当然,这也意味着该功能在python中不起作用! Python依赖于鸭子类型,这意味着当我们处理对象并且它起作用时,我们会确定对象是否属于某种类型.传递参数的类型对于C而言是一种确保传递的对象属于程序所需的类型的方法,但是在python中,每个对象在C端都是相同的类型,因此此功能在C上变得完全无用python端.

但这并不意味着它整体上完全没有用.例如,在python中,int是一个对象.但不是在C中.如果您使用的属性绑定是在Gtk库的C端编码的,则您将需要指定适当的类型,因为不同属性类型的绑定不起作用.

将C侧包装的信号处理程序与对象参数类型一起使用也注定是行不通的,因为C侧需要特定的类型才能起作用.

标签:gtk,pygtk,python
来源: https://codeday.me/bug/20191122/2061612.html