(Tcl / Tk)如何更改检查按钮配置

时间:2015-02-19 13:33:24

标签: tcl tk

我需要两个支票按钮,当' op.invariants'未经检查的“反对信息”#39;必须禁用。当' op.belief'检查,检查' ob.invariants'自动

按照代码:

checkbutton $op.invariants -text "Find Invariant Violations" -variable mcFindInvViolations -onvalue true -offvalue false \
    -command { if { !$mcFindInvViolations } { set st_abr "disabled";  $op.belief configure -state disabled } else { set st_abr "normal"; $op.belief configure -state normal } }

checkbutton $op.belief -text "Apply Belief Revision" -variable mcApplyBeliefRevision -onvalue true -offvalue false -state $st_abr \
    -command { if { $mcApplyBeliefRevision } { $op.invariants select } }

但是当我执行它时,会导致此错误: 无法阅读'操作:没有这样的变量

checkbutton以变量命名,但不是必须的

1 个答案:

答案 0 :(得分:1)

您遇到的问题是您在一个过程中运行此代码(明智地!),但回调脚本正在全局级别进行评估;这些不是封闭,它们只是简单的旧脚本。

修复方法是将回调代码放入以op值作为参数的过程中:

proc updatedInvariants {op} {
    global mcFindInvViolations st_abr; # List out variables as needed
    if { !$mcFindInvViolations } {
        set st_abr "disabled"
        $op.belief configure -state disabled
    } else {
        set st_abr "normal"
        $op.belief configure -state normal
    }
}
proc updateBelief {op} {
    global mcApplyBeliefRevision
    if { $mcApplyBeliefRevision } {
        $op.invariants select
    }
}

您构造代码以使用这些回调,以便将op的值绑定到它们。使用list命令很容易:

checkbutton $op.invariants -text "Find Invariant Violations" -variable mcFindInvViolations -onvalue true -offvalue false \
    -command [list updatedInvariants $op]
checkbutton $op.belief -text "Apply Belief Revision" -variable mcApplyBeliefRevision -onvalue true -offvalue false -state $st_abr \
    -command [list updatedBelief $op]

请注意,即使op包含各种奇怪的字符,这也有效; list只会做任何必要的引用。