我想实现示例结果,如何向labelframe添加一个checkbutton,如果选中checkbutton,框架将启用,谢谢! sample
答案 0 :(得分:1)
感谢Donal的建议,请在下面列出我的解决方案:
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
答案 1 :(得分:1)
当我看到这个问题并且Jimmy评论说他已经解决了这个问题时,我认为应该仍然有解释如何去做。当我开始这样做时,吉米已经添加了这样的解释。无论如何,我发布了我的建议,希望它有用。
这个答案部分基于Jeremy Cowgar在http://wiki.tcl-lang.org/20054页面上的示例,在按钮" Labelframes下启用其内容"。我已经对代码进行了简化,重构和一般化,希望在执行此操作时不会引入错误。我已经尝试过代码但没有彻底测试过。
我用过#34; classic"此示例中的窗口小部件(在命名空间tk
中):只需将命名空间更改为ttk
(如ttk::labelframe
中所示),以获取主题窗口小部件。有时需要进行更多更改,因为选项或子命令不同,但至少在本示例的范围内,它们的工作方式相同。
第一个目标是设置即将启用的labelframe
。它获得checkbutton
作为labelwidget(通过配置-labelwidget
选项):checkbutton获取一个全局变量和一个调用过程的命令脚本。只需要管理labelframe(使用pack
,grid
或其他),它自己管理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的shell(例如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), exit, foreach, grid, if, labelframe (widget), pack, package, proc, puts, set, winfo, {*} (syntax)