10

Python で GTK アプリケーションを開発しようとしていますが、gtk.TreeStore. 私の主な問題: 私はすでにいくつかの JSON を解析しており、基本的に Python リストと 2 種類のオブジェクトである独自のデータ構造を持っています。コレクションだけでなく、リストにも表示される可能性があります)。

私はすでに a の基本的な使用法に精通しており、TreeStoreアイテムを画面に正しくレンダリングすることができました。treestore は gobject 型しか格納できないという事実にどう対処すればよいかわかりません (gobject 型システムについてよく知らないので、この時点ではよくわかりません)。C のドキュメントには、次の (PixBuf を除く) 基本型がリストされています。これらは挿入可能で、Python データ型に自動的にマップされます。

例として、gtk_tree_store_new (3, G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_PIXBUF); それぞれ int、string、GdkPixbuf 型の 3 つの列を持つ新しい GtkTreeStore を作成します。

さらに、任意のGType. ドキュメントからのリンクは、この段落を直接指しています。

登録された型の一意の識別子を表す数値。

このトピックに関する私の調査はここで終わります。Google はほとんどが GTK 2.x のチュートリアルであり、strandintなどを除く他のデータ型の挿入については何も見つけていません。
質問:

  • 新しい GType (またはツリーストアへのカスタム データの挿入を可能にするその他のインターフェイス) を実装することは可能ですか? また、その方法は?
    私はすでに派生しようとしましGObjectたが、役に立ちませんでした。

  • 2 つのデータ構造を同時に保持しないようにするにはどうすればよいですか?
    つまり、解析結果と Treestore の重複情報です。

  • 混合コンテンツをどのように処理できますか?
    私の場合、さまざまな追加情報を持つコレクションとアイテムがあります(ツリービューでは、子の有無にかかわらずノードとしてミラーリングされます)。

上記の質問が解決された場合、選択を処理するときの問題も解消されます。単純なタイプのようなものと一致したり、以前に挿入したアイテムと一致したりするstrことは困難です。intそのような属性はキーである必要がありますが、解析結果をリストから検索することは効果的ではありません。

前もって感謝します!

質問に直接関係のない追加情報:


GTK 2TreeModelのチュートリアルでこれを読むまで、カスタムを実装するのは実行可能な課題になると思いました。

ただし、これには代償が伴います。すべての改行文字を削除しない限り、有用なカスタム モデルを 1,000 行未満で作成することはまずありません。カスタム モデルを作成することは、思ったほど難しくはありません。特に、追跡するデータが大量にある場合は、より適切なコードが作成されるため、努力する価値は十分にあります。

これはまだ有効ですか?


http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htmに出会いました。これは役に立ちますか? 多くのリソースは PyGTK 2.0 用です。非推奨。

4

1 に答える 1

16

問題が解決しました!同じ問題に遭遇した他の人のために、いくつかの役立つリソースとサンプル コードをまとめます。方法を知っていれば問題ありませんが、実際にはどこにも文書化されていません。

TreeView を Person で埋め、ボタンのクリックで選択した人を印刷するための完全なサンプル コード:

from gi.repository import Gtk
from gi.repository import GObject

class Person (GObject.GObject):
    name = GObject.property(type=str)
    age = GObject.property(type=int)
    gender = GObject.property(type=bool, default=True)

    def __init__(self):
        GObject.GObject.__init__(self)

    def __repr__(self):
        s = None
        if self.get_property("gender"): s = "m"
        else: s = "f"
        return "%s, %s, %i" % (self.get_property("name"), s, self.get_property("age"))

class MyApplication (Gtk.Window):

    def __init__(self, *args, **kwargs):
        Gtk.Window.__init__(self, *args, **kwargs)
        self.set_title("Tree Display")
        self.set_size_request(400, 400)
        self.connect("destroy", Gtk.main_quit)
        self.create_widgets()
        self.insert_rows()
        self.show_all()

    def create_widgets(self):
        self.treestore = Gtk.TreeStore(Person.__gtype__)
        self.treeview = Gtk.TreeView()
        self.treeview.set_model(self.treestore)
        column = Gtk.TreeViewColumn("Person")

        cell = Gtk.CellRendererText()
        column.pack_start(cell, True)

        column.set_cell_data_func(cell, self.get_name)

        self.treeview.append_column(column)
        vbox = Gtk.VBox()
        self.add(vbox)
        vbox.pack_start(self.treeview, True, True, 0)

        button = Gtk.Button("Retrieve element")
        button.connect("clicked", self.retrieve_element)
        vbox.pack_start(button, False, False, 5)

    def get_name(self, column, cell, model, iter, data):
        cell.set_property('text', self.treestore.get_value(iter, 0).name)

    def insert_rows(self):
        for name, age, gender in [("Tom", 19, True), ("Anna", 35, False)]:
            p = Person()
            p.name = name
            p.age = age
            p.gender = gender
            self.treestore.append(None, (p,))

    def retrieve_element(self, widget):
        model, treeiter = self.treeview.get_selection().get_selected()
        if treeiter:
            print "You selected", model[treeiter][0]

if __name__ == "__main__":
    GObject.type_register(Person)
    MyApplication()
    Gtk.main()
于 2012-06-24T19:35:45.740 に答える