2013-02-26 38 views
2

我想在Python中編寫一個GTK小部件,它是gtk.Bin的子類,我不確定如何去實例化它。我的班級的前幾行看起來像:Python GTK:實例化gtk.Bin的子類

class Completer(gtk.Bin): 

    def __init__(self, exts)): 

     gtk.Container.__init__(self) 
     child = gtk.VBox(spacing=15) 
     self.add(child) 

我不知道如何設置子屬性,因此代碼。但它掛起來就行了gtk.Container .__的init __(個體經營)與消息:

File "C:\Users\462974\Documents\Local Sandbox\tools\python\packages\GUI\tools\SNCompleter.py", line 133, in __init__ 
    gtk.Container.__init__(self) 
TypeError: cannot create instance of abstract (non-instantiable) type `GtkBin' 

這也恰好如果我叫gtk.Bin .__ init__。我不知道如何初始化這個子類,但大概是一種方法,因爲GTK確實有可用的gtk.Bin子類。

回答

1

您需要爲您的小部件註冊一個新的gtype,否則它將使用與超類相同的類,因爲它是一個抽象類,您將無法實例化它(如異常所示)。

有要註冊一個新的GTYPE的方法有兩種:

  1. 使用gobject.type_register
  2. 在你的類中設置__gtype_name__類變量。

下面是使用第二個選擇(因爲我認爲這是更straigth前進)的例子:

class Completer(gtk.Bin): 
    __gtype_name__= "Completer" 

    def __init__(self, exts, *args, **kwargs): 
     super(Completer, self).__init__(*args, **kwargs) 
     child = gtk.VBox(spacing=15) 
     self.add(child) 
+0

我做到了,現在運行成功,但小部件沒有顯示出來,即使我將所有內容都包裝在self.child中,並在頂層應用程序上調用show_all。 – dpitch40 2013-02-26 15:47:08

+0

我有一個類似的probrem嘗試從'GtkBin'繼承,但使用'pygobject'而不是'pypgtk'。 [這裏](http://stackoverflow.com/questions/14253553/extending-from-gtkbin)是我當時所做的問題,顯然在'GtkBin'的綁定中存在一些問題,可能它在pygtk上是一樣的' – asermax 2013-02-26 17:48:11

+0

子類別'gtk.Frame'或'gtk.Viewport'而不是'gtk.Bin'也修復了不顯示小部件的問題。 – cpburnz 2013-04-26 03:22:20