【问题标题】:How to implement a button whose functionality is a cross between radiobutton and checkbutton?如何实现一个按钮,其功能是单选按钮和复选按钮之间的交叉?
【发布时间】:2011-07-23 16:33:15
【问题描述】:

我想根据用户选择的选项动态禁用或启用checkbuttons。我想要的是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 之间的这种交叉,并且随着选项数量的增加也可以很好地扩展,那就太好了?

【问题讨论】:

    标签: checkbox radio-button tcl tk


    【解决方案1】:

    到目前为止,实现启用和禁用这种复杂模式的最简单机制是将trace 放在触发器变量上(在您的示例中为c1c3),以便在它们更改时重新计算状态。

    # _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"}]
    }
    

    (从概念上讲,您将控制器的一部分挂在模型上而不是视图上,因为它更“标准”——我们通常不谈论 Tk 的 MVC,因为 Tk 带有内置的控制器对于最基本的工作——但一切都可以直接进行,你可以设置一次,之后就不用再摆弄它了。)

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

    【讨论】:

    • 另外,Tk widget 演示(在 8.5 中)包括使用检查按钮启用事物的演示。
    • 更正:trace variable c1 w reconfigureButtons 而不是 trace add variable c3 write reconfigureButtons
    • @Anand:只有当你深深陷入过去以至于你仍在使用 Tcl 8.3 时。如果您是,GET WITH THE PROGRAM! 8.3 已经停产多年。它的继任者 8.4 也接近 EOL(在 8.6.0 发布时会有最终版本)。生产代码应使用 8.5。
    • (仍然支持旧语法,但是真的,你为什么还要使用它?它几乎没有助记性,并且可能在未来的某个时候消失 - 虽然公平地说,不在 8.6 中。)
    • 我正在使用旧的愿望尝试代码;阅读您的评论后,我意识到这是旧的愿望。很抱歉。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 2019-11-10
      • 1970-01-01
      • 2011-12-12
      • 2018-05-12
      • 2015-02-27
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多