2017-10-10 83 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