2013-10-05 61 views
3

我想自定義信號添加到一個類 -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__字典,當我說出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

有沒有一種方法,我可以通過一個列表是一個信號參數?

+1

嘗試TYPE_PYOBJECT。 – XORcist

+0

它的工作原理!使用'object'或'gobject.TYPE_PYOBJECT'。 請你解釋一下爲什麼? –

+1

指定TYPE_PYOBJECT時,可以使用任何Python對象。我猜它基本上代表'任何'。缺點是缺乏類型安全。 – XORcist

回答

2

C庫需要知道參數的C類型,對於Gtk,Gdk,Gio和GLib對象,封裝器中的類型將在Gtk和家族庫中反映C類型時起作用。

然而,對於任何其他類型的需要傳遞要麼objectgobject.TYPE_PYOBJECT。這意味着在C端通過「python object」類型。從python腳本訪問的每個對象都是這種類型,這幾乎意味着任何可以通過python腳本傳遞的對象都將適合object參數。

這也意味着,當然,這個功能並不在Python工作! Python依靠鴨打字,這意味着我們弄清楚,如果一個對象是一個類型,當我們做它的東西,它的工作。傳遞參數的類型C工作的方式,以確保傳遞的對象是程序需要他們成爲的類型,但是在Python 每個對象都是在C面的相同類型的所以這個功能完全變在python方面沒用。

但是,這並不意味着它是完全無用的整體。例如,在python int中是object。但不是在C中。如果您使用的是屬性綁定,它們在Gtk庫的C端編碼,您將需要指定適當的類型,因爲不同屬性類型的綁定不起作用。

用C側包裹object參數類型的信號處理程序也必然不工作,因爲C端需要一個特定類型的功能。

+0

感謝您的詳細解釋。除了'我們爲什麼要使用'object''疑問之外,我還學到了很多東西 –

0

在pygtk3這個錯誤已經發生了我,因爲import gobject直接。 並修復了這個錯誤from gi.repository import GObject。 你可以在這link看到詳細信息。