2017-10-10 4 views
1

サンプルの結果、ラボフレームにチェックボタンを追加する方法、チェックボタンを選択するとフレームが有効になります。ありがとう! samplelabelframeにチェックボタンを追加しますか?

+0

私は「-labelwidgetを使用して、それを解決しました" – Jimmy

+0

これは正しいアプローチです。答えとして書いてください。それは将来の他の人々を助けるでしょう。 –

答えて

1

、私はまだどのように説明があるべきことを考えていましたそれをやる。私がそれをやり遂げる時、ジミーはすでにそのような説明を加えていました。とにかく私の提案は役に立つと思って投稿しています。

この回答は、「内容を有効にするLabelframes」ボタンの下で、http://wiki.tcl-lang.org/20054ページのJeremy Cowgarの例に部分的に基づいています。私は、コードを少し簡略化し、再構成し、一般化しました。うまくいけばバグを導入しないでください。コードを試しましたが、徹底的にテストしませんでした。

私は、この例では(名前空間tkで)「クラシック」ウィジェットを使用している:ちょうどテーマにウィジェットを取得する(ttk::labelframe、などのように)ttkに名前空間を変更。オプションやサブコマンドが異なるため、より多くの変更が必要になることもありますが、少なくともこの例の範囲では同じ動作をします。

最初の目的は、有効になるlabelframeを設定することです。これは、-labelwidgetオプションを設定することによって、ラベルウィジェットとしてcheckbuttonを取得します。チェックボタンは、グローバル変数と、プロシージャを呼び出すコマンドスクリプトを取得します。のみlabelframeは(packgridまたは何を使用して)管理する必要がある、それは自分自身でチェックボタンを管理します。チェックボタンは.greeterの子になっている可能性がありますが、この方法では、ラベルフレーム内のウィジェットとは区別されます。

tk::labelframe .greeter 
tk::checkbutton .greeterEnabler -text {Say Hello} -variable greeterEnabled -command greeterEnablerAction 
.greeter configure -labelwidget .greeterEnabler 
pack .greeter -fill x -expand yes 

proc greeterEnablerAction {} { 
    if {$::greeterEnabled} { 
     set state normal 
    } else { 
     set state disabled 
    } 
    foreach child [winfo children .greeter] { 
     $child configure -state $state 
    } 
} 

labelframeはウィジェットで満たされていますが、この例では2つだけです。それらは、ウィンドウフレームの子になるように作られています。つまり、ウィンドウパスは.greeterで始まります。

set greeterName World 
tk::entry .greeter.name -textvariable greeterName 

tk::button .greeter.button -text {Do It} -command {puts "Hello, $greeterName"} 

labelframeの初期状態が設定されています。プロシージャgreeterEnablerActionは、invokeを使用して呼び出される代わりに、直接呼び出された可能性があります。

set greeterEnabled 1 
.greeterEnabler invoke 

labelframeの子は明示的に管理する必要があります。labelframeから独立している

pack {*}[winfo children .greeter] -fill x 

ウィジェットを追加することもできます。

tk::button .bt2 -text Exit -command exit 
pack .bt2 -fill x -expand yes 

再び完全なプログラム(Tkパッケージには、コードがTkで実行された場合に必要とされている必要はありません。このような)wishとして-enabledシェル:

package require Tk 

# set up the labelframe with a checkbutton as enabler 
tk::labelframe .greeter 
tk::checkbutton .greeterEnabler -text {Say Hello} -variable greeterEnabled -command greeterEnablerAction 
.greeter configure -labelwidget .greeterEnabler 
pack .greeter -fill x -expand yes 

proc greeterEnablerAction {} { 
    if {$::greeterEnabled} { 
     set state normal 
    } else { 
     set state disabled 
    } 
    foreach child [winfo children .greeter] { 
     $child configure -state $state 
    } 
} 


# fill it with widgets 
set greeterName World 
tk::entry .greeter.name -textvariable greeterName 

tk::button .greeter.button -text {Do It} -command {puts "Hello, $greeterName"} 

set greeterEnabled 1 
.greeterEnabler invoke 

pack {*}[winfo children .greeter] -fill x 

# this button is independent of the labelframe 
tk::button .bt2 -text Exit -command exit 
pack .bt2 -fill x -expand yes 

ドキュメント: button (widget)checkbutton (widget)exitforeachgridiflabelframe (widget)packpackageprocputssetwinfo{*} (syntax)

+0

素晴らしい!あなたの非常に網羅的で有用な説明をありがとう!それは本当に私に多くの利益をもたらす。 – Jimmy

1

ドナルのアドバイスのおかげでは、下の私の解決策をリスト:私はこの質問と、彼はそれを解決したことにジミーさんのコメントを見たとき

frame .f 
labelframe .f.lf 
checkbutton .f.lf.cb -text sample 
label .f.lf.lb -text "This is for test" 
.f.lf configure -labelwidget .f.lf.cb 
pack .f 
pack .f.lf 
pack .f.lf.lb 
関連する問題