ttk::treeview(1)

ツリービューは、標準Tkで初めての、 縦横2次元のテーブル状のデータを表示するために使えるウィジェットです。 左端の列はWindowsのエクスプローラのフォルダのように開いたり閉じたりするツリー構造を表現できます。
今回少し試した例は美観的にはあまり美しくないのですが、ぜひ幻滅せずに!!

set f1 [ttk::frame .f1]
set tb [ttk::treeview $f1.tb1 -show "tree headings" \
 -columns {Name Price Amount} -xsc "$f1.scrh set" -ysc "$f1.scrv set" ]
$tb column #0 -width 50
$tb column Name   -anc w -width 100
$tb column Price  -anc e -width 50
$tb column Amount -anc e -width 50
$tb heading #0     -text "種類"
$tb heading Name   -text "名前"
$tb heading Price  -text "単価"
$tb heading Amount -text "在庫"

set id [$tb insert {} end -text 野菜]
$tb insert $id end -values {きゅうり    70 50} -tag tag1
$tb insert $id end -values {トマト     100 64}
$tb insert $id end -values {じゃがいも 220 32} -tag tag1
set id [$tb insert {} end -text 果物 -open true]
$tb insert $id end -values {メロン 3500 8}
$tb insert {} end -text その他 -values {"? アイテム" 1000 10}

$tb tag configure tag1 -background #ddddff

ttk::scrollbar $f1.scrv -orient v -command "$tb yview"
ttk::scrollbar $f1.scrh -orient h -command "$tb xview"
grid $f1.tb1  -column 1 -row 1
grid $f1.scrv -column 2 -row 1 -sticky ns
grid $f1.scrh -column 1 -row 2 -sticky ew
pack $f1

ツリービューは::ttk::treeviewコマンドで作ります。 それで最初の疑問は大変不謹慎ながら、ツリービューという名前なんですけど、 標準Tkで初めて縦横2次元のテーブル状のデータを表現できるウィジェットなんですから、 その目的だけに使いたい、つまり「ツリー部が邪魔なら消せるのか」という。
えーと、消せます。 -show "tree headings"オプションのtreeがツリー部を、headingsが列見出し部分を表し、 -showの要素から片方または全部を外せば表示されなくなります。
後、サンプルを上から順に。treeviewの-columnsオプションで、 ツリー部以外の右の列(以後データ列と呼びます)を定義できます。 (ツリー部は最初から必ず存在します) -columnsの各要素が列見出しの文字列なのか思いきやそうではなく、 各列を識別する「ID」と思えばokです。 columnとheadingのサブコマンドで列の設定を行います。 その中で、より具体的にはheadingの-textオプションで、列見出しの文字列が設定できます。
列の設定ができたら今度はinsertコマンドで行を追加します。 「$tb insert {} end -text 野菜」 insertの次の引数は「親の行」の識別子です。{}は親がいない、 つまりツリーのトップレベルに追加するという意味になります。 各行の「識別子」は、insertの-idオプションで明示的に指定することができるほか、 insertサブコマンドの戻り値が自動発番された値なので、それを渡すこともできます。
次の"end"は、行を追加する位置で、endは末尾という意味です。 -textは、ツリー部(左端の列)に表示するラベルになります。 -valuesは、データ列の各列の値を設定します。 -openは「誰かの親の行」言い方を変えるならば「子を持つ行」に有効なオプションで、 ツリーを「開いた」状態にするか、「閉じた」状態にするかを設定します。 デフォルトはfalse=閉じている状態になります。

それで一応作ってみたものの、表示に関して指定できるオプションが妙に少ないような… 例えば各行、各列の間を区切る境界線ぐらい表示できてもいいような気がするのですが。 これも今後の機能追加に期待、なのかしらん…?

やねうらの top
(first uploaded 2010/09/26 last updated 2010/09/26, MISUMI URANO)