Tixいろいろ (1)
 ここまでで私はもう満腹でおなかが気になる生き様ですが、 まだまだ食い足りない育ち盛りの皆様のために、 さらに次のウィジェットを一同に紹介しましょう。
package require Tix
wm title . "Seminar Registration"

### tixNoteBook
set fa [frame .fa]
set noa [tixNoteBook $fa.noa -width 300]

$noa add pagePersonalInfo -label 申込者の情報
$noa add pageLocation     -label 会場と講座
$noa add pageDays         -label 開催スケジュール

proc genPersonalInfo page {
    global ParamInfo
    #### tixLabelEntry
    tixLabelEntry $page.lename -label お名前: -labelside left
    $page.lename subw entry configure -textvariable ParamInfo(name) \
      -width 20
    tixLabelEntry $page.leage  -label 年齢:   -labelside left
    $page.leage subw entry configure -textvariable ParamInfo(age)
    tixLabelEntry $page.letel  -label 連絡先TEL: -labelside left
    $page.letel subw entry configure -textvariable ParamInfo(tel) \
      -width 30
    #### tixOptionMenu
    tixOptionMenu $page.omjob -label ご職業: -labelside left \
      -variable ParamInfo(job)
    foreach e {会社員 公務員 自営業 奥様 学生} {
        $page.omjob add command $e -label $e
    }
    foreach e {lename leage letel omjob} {
	pack $page.$e -side top -anc w
    }
}

proc genLocation page {
    global ParamInfo

    # tixLabelFrameに直接子ウィジェットを載せることはできません。
    # tixLabelFrameのサブウィジェットframeを取得して、
    # その上に載せるようにします。
    tixLabelFrame $page.tlfa -label 会場
    tixLabelFrame $page.tlfb -label 講座
    pack $page.tlfa $page.tlfb -side left

    set fa [$page.tlfa subwidget frame]
    set fb [$page.tlfb subwidget frame]
    foreach e {京都 大阪 堺 神戸} {
	pack [radiobutton $fa.rad$e -text $e -value $e \
              -variable ParamInfo(location)] -side top -anc w
    }
    set ParamInfo(location) 京都
    foreach e {入門 初級 中級 上級} {
	pack [radiobutton $fb.rad$e -text $e -value $e \
              -variable ParamInfo(cource)] -side top -anc w
    }
    set ParamInfo(cource) 入門
}

proc CBok {} {
    global ParamInfo
    tk_messageBox -title "登録情報" \
      -message "お名前:$ParamInfo(name) 年齢:$ParamInfo(age) \
      連絡先:$ParamInfo(tel) ご職業:$ParamInfo(job) \
      会場:$ParamInfo(location) 講座:$ParamInfo(cource)"
}

genPersonalInfo [$noa subwidget pagePersonalInfo]
genLocation     [$noa subwidget pageLocation]
# -raisecmdにはそのページが表示されようとしたときに実行させたいコマンドを
# 指定します。
$noa pageconfigure pageDays -raisecmd CBScheduleRaised

proc CBScheduleRaised {} {
    set w [toplevel .wme]; wm title $w "Searching..."
    image create photo Image1 -file /usr/icons/productfeedback.gif
    label $w.la -image Image1
    label $w.lb -text "スケジュールを検索しています…"
    tixMeter $w.ma -fillcolor #600040 -value 0.0
    grid $w.la -row 1 -col 1
    grid $w.lb -row 1 -col 2
    grid $w.ma -row 2 -col 1 -columnspan 2
    update
    startMeter $w.ma
}

proc startMeter ma {
    set cval [$ma cget -value]
    if {$cval < 1.0} {
        $ma configure -value [expr $cval + 0.05]
        after 200 startMeter $ma
    } else {
	update
        tk_messageBox -message "空席のある日は見つかりませんでした。"
        # toplevelごと消す
        destroy [winfo parent $ma]
    }
}

button .cmda -text 申し込む -command CBok
button .cmde -text 中止 -command exit

pack $noa; pack $fa -side top
pack .cmde -side right -anc e -padx 5 -pady 5
pack .cmda -side right -anc e -padx 5 -pady 5
# end.

スクリーンショット

●tixNoteBook(ノートブック)
 ノートブックは、 ラベルのついたタブをクリックすることで幾つかのページを切り替えて表示することができるウィジェットで、 限られた画面の範囲内で集積度の高いアプリケーションを構築するのに威力を発揮します。
 ノートブックは、tixNoteBookコマンドで作ります。 ただしそれだけでは使うことができず、各タブに対応するタブページを何ページが追加する必要があります。 これはウィジェットのaddサブコマンドで行います。

$noa add pageDays -label 開催スケジュール
addの次に来る引数がページ識別子で、 これは各ページを一意に識別できる名前をつけます。 -labelで指定した文字列がタブ部に表示されるラベルです。
 これで空のページが作れますので、 あとは各ページに適当にウィジェットを載せていくだけです。 が、そのためには
  1. ノートブックウィジェットのsubwidget サブコマンドを使い、各ページに相当するウィジェット(ページフレーム(*1)) を取り出す。
  2. ページフレームの子として、ページに載せたい各ウィジェットを作り、 packコマンドなどで貼りつける。
という二段階の操作が必要となります。 ノートブックウィジェットの直の子としてウィジェットを作ることはできないということ、 ページフレームはノートブックの直の子ではないことに特に注意してください。 サブウィジェットはTixのいろいろなウィジェットに共通する概念ですのでここでこうるさく繰り返しておきますと、 サブウィジェットは親ウィジェットに直に載っているわけではありません(*2)。
(*1) 「ページフレーム」という呼び名は当サイトが勝手につけた呼び名です。
(*2) ページフレームの名前をputsコマンドで表示させてみると分かりますが、 サブウィジェットは親ウィジェットから見て曽孫になります。
set pageframe [$noa subwidget pageDays]
label $pageframe.lab1 -text "開催日程"
checkbutton $pageframe.chk1 -text "大安の日希望" -variable taian
またページの属性を後で変えるにはノートブックの pageconfigureサブコマンドを使います。 下の例ではここで-raisecmdオプションを使っています。 これはそのページに切り替わろうとした直前に実行したいプロシージャを指定するためのオプションです。
$noa pageconfigure pageDays -raisecmd CBScheduleRaised
ここで指定するのはページ識別子の方です。 ページ識別子とページフレームのウィジェット名を混同しないように。 大注意! 私は見事にはまりました。

●tixLabelEntry(ラベルエントリー)
 ラベルエントリーと聞いてその形を想像できる人は少ないでしょう。 なんとこれは、ラベルとエントリーが一緒になったものです。 …いて!殴らないで!穴に埋めないで! ほらそこ!道路に唾を吐かないで!(いつのまにか注意役に回ってる) あーそれはさておき、 一緒になって何が嬉しいかというと、別に。 ああ、それではあんまりなので、投げやりにならずに一応紹介してみます。
 ラベルエントリーはtixLabelEntryコマンドで作ります。 -labelオプションでラベルにする文字列を、 -labelsideオプションでエントリに対するラベルの位置を left、topなどで指定します。後者のデフォルトはleftです。

tixLabelEntry $w.tlea -label お名前 -labelside left
で、ラベル部、エントリ部の設定はそれぞれラベルエントリーの subwidgetサブコマンドでサブウィジェットとして取り出して行うことになります。 これは
set subw [$w.tlea subwidget entry]
$subw configure -textvariable momomo
としてもよいですが、
$w.tlea subwidget entry configure -textvariable momomo
と一行で書くことも可能です。 あ、ラベルウィジェットを取り出すときには「subwidget label」 エントリウィジェットを取り出すときには「subwidget entry」 とします。

●tixOptionMenu(オプションメニュー)
 オプションメニューは、 他のGUIツールキットでしばしばチョイスとかドロップダウンリストボックスと呼ばれるウィジェットで、 基本的にはリストボックスやラジオボタンのように幾つかの項目の中からただ1つのそれをマウス操作で選択するためのウィジェットです。 選択肢がプルダウンするため普段は場所をとらず、 これも画面を集積的にするために役立ちます。 見た目はラベルやボタンによく似ていますが、 ラベル文字列の他に小さな「ポチ」が現れるのが特徴です。 余談ですがこの「ポチ」はXウィンドウシステムのGUIスタイルに大きな影響を与えた商用GUIツールキット OSF/Motif のスタイルに端を発する由緒正しい目印です。
 オプションメニューはtixOptionMenuコマンドで作ります。 その主要なオプションは-label と-labelsideと-variable で、-labelは普段表示するラベル文字列、 -labelsideは「ポチ」に対するラベル文字列の相対位置、 -variableは現在選択されている項目を格納するTcl変数の名前をそれぞれ指定します。
 オプションメニューに項目を追加するにはTkのメニューと同様 add サブコマンドで行います。 普通の項目は「add command」で追加しますが、 その後ろに項目を識別する名前をつける必要があります。 この名前は、-labelオプションで指定する表示文字列と同じでも、 違っても構いません。 また、-commandオプションを指定する必要はありません。

foreach e {会社員 公務員 自営業 奥様 学生} {
    $page.omjob add command $e -label $e
}
現在選択されている項目の名前を知るには、 -valueオプションの値を取得します。
set item [$page.omjob cget -value]

スクリーンショット

●tixLabelFrame(ラベルフレーム)
 ラベルフレームの外見を見ると、 そういえばなんでTkにはこのようなものがなかったのだろう、 と不思議に思うほどポピュラーなウィジェットです。 ラベルフレームはtixLabelFrameコマンドで作ります。 主要なオプションは-labelと-labelsideで、 -labelの説明は不要でしょう。-labelsideですが、デフォルトでは acrosstop (フレームの左上を覆い隠すように表示する) となっています。これは top や left などに変えることもできますが、 かえって格好悪くなってしまうのでデフォルトのままの方がよいと思います。

tixLabelFrame $page.tlfa -label 会場
で、フレームで囲んだ中に子ウィジェットを載せていくわけですが、 tixLabelFrameに直接子ウィジェットを載せることはできません。 subwidgetコマンドでframeサブウィジェットを取り出し、 その上に載せる必要があります。
set fa [$page.tlfa subwidget frame]
foreach e {京都 大阪 堺 神戸} {
    pack [radiobutton $fa.rad$e -text $e -value $e \
          -variable ParamInfo(location)] -side top -anc w
}
なお、Tixのラベルフレームは本当に単に外見上だけのウィジェットです。 ラジオボタンなどのグルーピングには特別な機能を提供するわけではないので、 他のGUIツールキットのこのようなウィジェットの概念に慣れている場合は注意が必要です。

スクリーンショット

●tixMeter(メーター)
 メーターというのは何ですかと人の問う。 ありていにいって、「プログレスバー」という呼び名の方がポピュラーだと思います。 時間がかかる処理の進み具合をパーセンテージで表示する横向きのバーのことです。 メーターはtixMeterコマンドで作ります。 そのオプション-fillcolorはバーを塗る色の指定なのでいいとして、 メーターのバーの制御をするのは-value というオプションです。これに0.0〜1.0の値を指定することで、 進み具合をバーに反映させることができます。

tixMeter $w.ma -fillcolor #600040 -value 0.0
# ...
set cval [$ma cget -value]
$ma configure -value [expr $cval + 0.05]

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