ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PyGTK自定义信号将列表作为参数发送

2019-11-22 18:09:49  阅读:280  来源: 互联网

标签:gtk pygtk python


我正在尝试向类添加自定义信号-

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有