2017-10-10 85 views
1

我想實現樣例結果,如何添加一個checkbutton到labelframe,如果選擇checkbutton,框架將被啓用,謝謝! sample在labelframe中添加一個checkbutton?

+0

我以「-labelwidget解決它」。 – Jimmy

+0

這是正確的方法。請把它寫成答案;它將在未來幫助其他人。 –

回答

1

當我看到這個問題,吉米的評論,他已經解決了這個問題,我在想,還有應該如何解釋做到這一點。當我開始這樣做時,吉米已經添加了這樣的解釋。無論如何,我發佈我的建議,希望它會有用。

此答案部分基於Jeremy Cowgar的頁面http://wiki.tcl-lang.org/20054上的示例,在「啓用其內容的Labelframes」按鈕下。我對代碼進行了簡化,重構和泛化,希望在這樣做時不會引入錯誤。我已經嘗試了代碼,但沒有完全測試它。

我曾用「經典」的小部件(在命名空間tk)在這個例子:剛剛命名空間更改爲ttk(如ttk::labelframe等),以獲得爲主題的小部件。有時需要更多的更改,因爲選項或子命令是不同的,但至少在本示例的範圍內它們的工作原理是相同的。

第一個對象是設置labelframe,它將被啓用。它獲得一個checkbutton作爲labelwidget(通過配置-labelwidget選項):checkbutton獲取一個全局變量和一個調用過程的命令腳本。只有labelframe需要管理(使用pack,grid或其他),它自己管理checkbutton。 checkbutton可能是.greeter的子項,但這樣它將與labelframe中的小部件截然不同。

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中充滿了小部件,在本例中只有兩個部件。它們被製成labelframe的兒童,即他們的窗戶路徑始於.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的孩子需要明確管理。

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

小工具獨立於labelframe的,也可以添加:

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

完整的程序再次(在Tk包沒有如果代碼是在TK運行需要 - 啓用殼如wish):

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