試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PyGTKでツリービューにリストのデータ(ListStore)を表示(概要とメモ)

ツリービューについて

GTKのツリービューという部品はリスト(gtk.ListStoreオブジェクト)を表示するのはもちろん、階層を持ったデータ(gtk.TreeStoreオブジェクト)を表示することもできる。どちらのデータ形式であっても、データ自身とツリービューとは関連付けられてはいるものの、別々のオブジェクトとして扱うことになる。これは、複数行の文字列を表示する部品であるテキストビュー(gtk.TextView)とそのデータであるテキストバッファ(gtk.TextBuffer)の関係と似ている。
各セルには文字以外にも画像(gtk.gdk.Pixbuf)を表示したりチェックボックスラジオボタンを表示したりもできる。
ツリービューは高度なことができる反面とっつきにくい。また、扱い方も色々と幅広く、ここで全てを書くことはできない。

ツリービューには何が必要か

  • 各コラムの番号(データのどの項目をそのコラムと関連付けるのかを指定*1するのに使用)・組み込み関数range()で連番生成することが多い
  • 各セルを描画するセルレンダラ(gtk.CellRendererのクラスを継承した、種類(テキストや画像など)ごとのオブジェクトとその設定(場合によってはそのシグナルも設定)
  • 表示する各コラム(gtk.TreeViewColumn)のオブジェクト
  • データ(gtk.ListStoreもしくはgtk.TreeStore)・これらはgtk.TreeModelを継承していて「モデル」とも呼ばれる

色々なクラスが登場し関連を持っているため、それをきちんと理解する必要がある。慣れるまではしんどい。

メモ

  • ツリービューとデータの関連付けは、データのgtk.ListStore/gtk.TreeStoreのオブジェクトを事前に作成してからgtk.TreeViewオブジェクトのメンバ関数set_model()で行うことによってできるが、ツリービューの作成時にデータ(gtk.ListStoreやgtk.TreeStore)のオブジェクトを「treeview = gtk.TreeView(model=gtk.ListStore([gtk.ListStoreのコンストラクタ引数]))」のようにして同時に作成し、これを関連付けることもできる
  • gtk.ListStoreは固定要素数なタプル型をリストにしたようなデータ*2を持つが、初期化時に(タプルのような1つのまとまりの中における)各項目の型を決める必要があり、その型に合ったデータのみ受け付ける
  • gtk.ListStore(int, str, str)」として初期化したListStoreは「整数/文字列/文字列」の構造を持つ・これはPythonの型を使用しているが、リファレンスのようにGObjectで定義される型を使用することもできる・また、チュートリアルも参照
  • gtk.TreeViewColumnオブジェクトのコンストラクタでは、最初にツリービューの一番上に表示される説明文字列、次にセルレンダラオブジェクトを指定するが、その後ろには「text=[コラム番号]」などの追加の引数を渡す必要があり、左側の「text=」の部分はgtk.CellRendererTextオブジェクトのメンバ変数と対応したものとなっていて、セルレンダラの描画に関する設定*3となる・「=」の右側はコラム番号で、事前に連番として作成しておいたコラム番号と合わせる・テキストを表示するgtk.CellRendererTextでは「text=」で表示文字列のコラム番号と対応付ける
  • セルレンダラには色々種類があるが、全てgtk.CellRendererオブジェクトを継承している
  • TreeViewのオブジェクトからは関連付けられたListStore(あるいはTreeStore)がメンバ関数get_model()から取り出せて、ListStoreの場合はそのメンバ関数append()にタプルの形でデータを1つずつ追加していく形になる
  • データが追加されるとツリービュー上に変更が反映される
  • gtk.ListStoreクラスはgtk.TreeModelクラスを継承しているため、このページのメンバ関数なども使用できる
  • ツリービューには1行おきにシマシマが付くものと付かないものとがあるが、これはgtk.TreeViewオブジェクトメンバ関数set_rules_hint()でTrueを指定すると付く・ただし、GTK+ 2のテーマによってはTrueでもシマシマが出ない場合がある

関連記事:

参考URL:

*1:つまり、データ側にはツリービューに表示されない項目が作れるということでもある

*2:具体的な形にすると「[(1, "abc", True), (2, "def", False), (3, "ghi", False)]」などのようなイメージ

*3:細かな書式をListStore/TreeStore側の個別の項目に持たせることになる