Tixのグリッド (1)

TixのグリッドはTkのgridコマンドとは何の関係もありません。 これは縦横に格子状に区切られたセルに文字や画像、 ウィジェットなどを入れることができるワークシート状のウィジェットです。 特筆すべきことは各セルの内容をインラインで編集できることで、 この機能を備えたワークシート(グリッドボックス) をもつツールキットはオープンソースではまだまだ珍しいといえます。 さながらTcl/Tkの拡張らしく簡潔な記述で使うことができ、これで嬉しさ都合2倍。 さっそく使ってみましょう。

package require Tix
wm title . "Inventory I"

# tixGridの-formatcmdで指定するコールバックプロシージャ
proc CBFormat {w area x1 y1 x2 y2} {
    case $area {
        main {
            $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #c0c0c0 -fill 1
        }
        x-margin {
            $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #f0c0c0 -fill 1
        }
        y-margin {
            $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #c0c0f0 -fill 1
        }
        s-margin {
            $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #f0f0f0 -fill 1
        }
    }
}

# 各セルの色やスタイルは、オプション -formatcmd
# で指定したTclコマンドで行います (CBFormatを見てね)
set f [frame .f]
set g [tixGrid $f.g -width 8 -height 6 -format "CBFormat $f.g" \
       -xscrollcommand "$f.scrh set" -yscrollcommand "$f.scrv set"]
set scrv [scrollbar $f.scrv -ori v -com "$g yview"]
set scrh [scrollbar $f.scrh -ori h -com "$g xview"]
grid $g -row 0 -column 0
grid $scrv -row 0 -column 1 -sticky ns
grid $scrh -row 1 -column 0 -sticky ew

# ここから列の幅を指定し、データを入れていきます。
$g size col 0 -size 16char
$g set 0 0 -itemtype text -text 品目

set RowTitles {
    とりもも テンダーロイン ハンバーグ
    さかなフライ コロッケ 冷錦糸卵 冷いんげん 冷ブロッコリー
}
set y 1
foreach e $RowTitles {
    $g set 0 $y -itemtype text -text $e; incr y
}
set ColTitles { 10 11 12 13 14 15 16 17 18 }
set x 1
foreach e $ColTitles {
    $g size col $x -size 4char
    $g set $x 0 -itemtype text -text $e; incr x
}
set data {
    {2 * * 2 * * 2 * *}
    {1 3 * 2 * 1 3 * 2}
    {1 * 4 * 1 3 * 2 1}
    {* * * 2 * * * 3 *}
    {1 * 1 * * * 1 * *}
    {* 3 * * * 3 * * 2}
    {* * 2 2 * * 2 2 *}
    {* 1 1 * * 1 1 * 1}
}
set y 1
foreach e $data {
    set x 1
    foreach d $e {
        $g set $x $y -itemtype text -text $d; incr x
    }
    incr y
}
button .b -text 終了 -command exit
pack $f .b -side top -anc e
# end.

スクリーンショット

グリッドはtixGridコマンドで作ることができます。 tixScrolledGridという、 スクロール機能を備えたグリッドの親分もありますが、 とりあえずtixGridのほうでいってまいりましょう。 こいつはスクロール機能がないので、 Tkのリストボックスなどと同じ要領で隣にスクロールバーをつけてやります。

set g [tixGrid $f.g -width 8 -height 6 -format "CBFormat $f.g" \
  -xscrollcommand "$f.scrh set" -yscrollcommand "$f.scrv set"]
-widthと-heightは最大のセル数で指定します。 で、各セルの色やフォントなどを指定したい場合には、 -formatcmd (-format)オプションでコールバックプロシージャを指定します。 これは、セルの描画が必要になったときに呼ばれるプロシージャで、 後ろに自動的に5つの引数がつけられます。

proc CBFormat {w area x1 y1 x2 y2} {
    case $area {
        main {
            $w format grid $x1 $y1 $x2 $y2 \
              -bd 1 -bordercolor #606060 -relief raised \
              -bg #c0c0c0 -fill 1
        }
        # 略
    }
}
(x1,y1)〜(x2,y2) が対象となるセルの範囲で、areaは次のように定義されます。
  • x>0かつy>0のとき ... main
  • x=0かつy=0のとき ... s-margin
  • x=0かつy>0のとき ... y-margin
  • x>0かつy=0のとき ... x-margin
formatサブコマンドはまだちゃんとマニュアルに解説されていませんが、 format gridさぶさぶコマンドとformat borderさぶさぶコマンドを持ちます。 format gridさぶさぶコマンドがセルの内部(セルの境界線から3ピクセル以上)、 format borderさぶさぶコマンドがセルの境界線から3ピクセル以内の描画体裁の指定に使われます。 オプションは上の感じでなんとなく分かると思うので、 いろいろ試してみてください。 ここでは左上隅のセル(areaがs-margin)なら白で、 上辺のセル(x-margin)なら赤で、左辺のセル(y-margin)なら青で、 それ以外ならダークな感じで塗るよう指定しています。

次に行の高さ、列の幅ですが、標準ではauto(必要最小限の大きさを自動的にとる) となっています。これを指定するにはsizeサブコマンドを使います。

$g size col 0 -size 16char
-sizeの単位はピクセルなのに注意してください。文字数を指定したいときは 6charのように "char" をつけます。 この値のデフォルトが "auto" というわけです。

そしていよいよセルにデータを入れていくわけですが、 これはsetサブコマンドに行、列の順番で位置を指定して行います。 行、列とも最初が零です。

$g set 0 0 -itemtype text -text 品目
-itemtypeはtextのほかにimage、imagetext、windowがあります。 imageは画像を、 imagetextは画像とテキストを両方表示するものです。 -textは-itemtypeがtextのときに使えるオプションで、 -itemtypeがimageのときは代わりに-imageを、 windowのときは-windowを使うことになります。 なお後のページで出てきますが-itemtypeがimagetextの場合は -textと-imageを両方指定すればOKです。 どんなオプションが指定できるのかは、 マニュアルのDisplay Itemsの項をご覧ください。

ところでグリッドをスクロールバーでスクロールさせてみると、 上辺、左辺のセルはスクロールせずにそのまま残ります。 このあたりの気が利いた制御は最初から行われるため、 我々にとってはとても使いやすくなっています。

拡張レビュー分室 top
(first uploaded 2001/04/13 last updated 2010/09/24, MISUMI URANO)