如何实现一个按钮,其功能是radiobutton和checkbutton之间的交叉?

时间:2011-07-22 22:35:11

标签: checkbox radio-button tcl tk

我想根据用户选择的选项动态禁用或启用checkbutton。我想要的是radiobuttoncheckbutton之间的交叉。

checkbutton .c1 -text "C1" -variable c1
checkbutton .c2 -text "C2" -variable c2
checkbutton .c3 -text "C3" -variable c3
checkbutton .c4 -text "C4" -variable c4

grid .c1 -sticky w
grid .c2 -sticky w
grid .c3 -sticky w
grid .c4 -sticky w

在上面的示例中,如果我选中C1,那么选项C2C4应该显示为灰色。 同样,如果我选中C3,那么C4应该显示为灰色。

如果有一种优雅的方法可以在radiobuttoncheckbutton之间实现这种交叉,那么它会很好,随着选项数量的增加也能很好地扩展?

2 个答案:

答案 0 :(得分:4)

到目前为止,实现启用和禁用复杂模式的最简单机制是在触发变量(tracec1的示例中)放置c3,以便每当它们出现时改变你重新计算状态。

# _After_ initializing the state...
trace add variable c1 write reconfigureButtons
trace add variable c3 write reconfigureButtons
proc reconfigureButtons args {
    global c1 c3
    .c2 configure -state [expr {$c1      ? "disabled" : "normal"}]
    .c4 configure -state [expr {$c1||$c3 ? "disabled" : "normal"}]
}

(从概念上讲,你将Controller的一部分悬挂在Model上而不是View上,因为它更像是“标准” - 我们通常不会谈论MVC for Tk,因为Tk带有内置控制器对于大多数基本工作 - 但它都是直接工作的,你可以设置一次,然后不用它来捣乱。)

但是,不要混淆检查按钮和单选按钮(正如您的问题文本似乎表明的那样)。请。这是因为它们为用户提供了不同的视觉提示:支票按钮是开关开关,无线电按钮是“选择其中一种”,并且以任何其他方式使用它们只会使事情更难以使用而没有其它好处

答案 1 :(得分:1)

听起来你只需要在检查支票簿时监听,并根据它禁用/启用其他框。您可能还需要为每个框保留“禁用”计数,并确保仅在禁用计数为零时启用每个框。因此,检查C3,然后检查C1,然后再检测C1,将不会重新启用C4,因为C4仍将具有禁用计数1。再次检查C3实际上会使C4的禁用计数为零,并且应该重新启用C4。

您可以概括此功能,并以某种描述性方式链接复选框,而不是功能性方式。