|
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(ノートブック) $noa add pageDays -label 開催スケジュールaddの次に来る引数がページ識別子で、 これは各ページを一意に識別できる名前をつけます。 -labelで指定した文字列がタブ部に表示されるラベルです。 これで空のページが作れますので、 あとは各ページに適当にウィジェットを載せていくだけです。 が、そのためには
(*1) 「ページフレーム」という呼び名は当サイトが勝手につけた呼び名です。 set pageframe [$noa subwidget pageDays] label $pageframe.lab1 -text "開催日程" checkbutton $pageframe.chk1 -text "大安の日希望" -variable taianまたページの属性を後で変えるにはノートブックの pageconfigureサブコマンドを使います。 下の例ではここで-raisecmdオプションを使っています。 これはそのページに切り替わろうとした直前に実行したいプロシージャを指定するためのオプションです。 $noa pageconfigure pageDays -raisecmd CBScheduleRaisedここで指定するのはページ識別子の方です。 ページ識別子とページフレームのウィジェット名を混同しないように。 大注意! 私は見事にはまりました。
●tixLabelEntry(ラベルエントリー) 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(オプションメニュー)
foreach e {会社員 公務員 自営業 奥様 学生} {
$page.omjob add command $e -label $e
}
現在選択されている項目の名前を知るには、
-valueオプションの値を取得します。
set item [$page.omjob cget -value]
●tixLabelFrame(ラベルフレーム) 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 $w.ma -fillcolor #600040 -value 0.0 # ... set cval [$ma cget -value] $ma configure -value [expr $cval + 0.05]
|