dullhikoのだるいブログ

殆ど日記のだるいブログ

PyGTKのツリービューに苦戦する その1

2005年09月11日 | Python
すでにシリーズ化決定しているというタイトルで。

GtkのTreeViewって初めて触ったが、面白い設計になってる。
Windows APIのツリービューのシンプルさも捨てがたいが。

まず、ツリービューの中身を保持するのはGtk.TreeModelクラス。実際にはGtk.TreeStoreというその派生クラスが一般的なようだ。
Win32のツリービューではNodeのItem(data)っていう感じの32bit長のデータにキャストして持たせてるような感じでいまいち分離して無い感じだったが、GTKは完全にツリービューが「ビュー」なのだな。

そして、rendererというのがあって、それで描画を簡単かつ柔軟にカスタマイズできるようになっている。これは面白い。

さて、今回苦戦したのはヘッダのカラムである。
カラムもGtk.TreeColumnという独立したクラスになっており、そいつをビューにappendするという方式になっている。
よく知らずにやってた俺はカラムだけを2つほどappendし、そしてモデルのset_valueメソッドを呼び出し、

model.set_value(iter, 2, "hogehoge")

ってな感じでやっていた。ところが。
カラム番号が不正という内容のランタイムエラーが出てしまう。
ちゃんとカラムは二つappendしているし、
len(treeview1.get_columns())
でもカラム数は2と帰ってくる。ちゃんと実行できているわけだ。

さらには、ためしに

model.set_value(iter, 0, "hoge-")

とやってみても、PyObjectじゃねぇよとか言われてしまう。
何がいけないんだ?と散々悩んだわけだが。
コピペしたサンプルコードをちゃんと読んでいなかったのが失敗の元だ。

model = gtk.TreeStore(gobject.TYPE_PYOBJECT, gobject.TYPE_STRING)

ここのTreeStoreでの引数でカラムの種類を設定していたのだ。だから2は存在しないし、0はPyObjectじゃないとダメってことだったわけだ。
というわけで、最も単純なツリービューのカラム挿入の手順を以下にまとめておこう。

1 #重要。ここでカラムの種類を制限している。 2 model = gtk.TreeStore(gobject.TYPE_STRING) 3 4 treeview1.set_model(self.model) 5 renderer = gtk.CellRendererText() 6 column = gtk.TreeViewColumn("Header1", renderer, text=0) 7 treeview1.append_column(column) 8 # 追加したからといってカラムを自由にできるわけじゃない。 9 # でも追加しないと何も始まらない。 10 11 iter = model.insert_before(None, None) 12 model.set_value(iter, 0, "hoge")


Gtk.TreeStoreを作るときの引数と、TreeColumnを作るときの引数に気を配ればいいということだろう。

最新の画像もっと見る