2

gtk.Binのサブクラスである Python で GTK ウィジェットを作成しようとしていますが、それをインスタンス化する方法がわかりません。クラスの最初の数行は次のようになります。

class Completer(gtk.Bin):

    def __init__(self, exts)):

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

child 属性を設定する方法がわからないため、そのコードです。しかし、次のメッセージとともに gtk.Container.__init__(self) 行でハングアップします。

  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 の使用可能なサブクラスがあるため、おそらく方法はあります。

4

1 に答える 1

1

ウィジェットに新しい gtype を登録する必要があります。そうしないと、スーパー クラスと同じものが使用されます。これは抽象クラスであるため、(例外が示すように) インスタンス化できません。

新しい gtype を登録するには、次の 2 つの方法があります。

  1. を使用してgobject.type_registerいます。
  2. __gtype_name__クラスにクラス変数を設定します。

2 番目の選択肢を使用した例を次に示します (より単純な方法だと思います)。

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)
于 2013-02-26T15:16:59.940 に答える