首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Tcl/Tk)如何更改校验按钮配置

(Tcl/Tk)如何更改校验按钮配置
EN

Stack Overflow用户
提问于 2015-02-19 13:33:24
回答 1查看 779关注 0票数 0

我需要两个复选按钮,当“op.invariants”未选中时,必须禁用“op.belief”。当选中“op.belief”时,自动检查“ob.invariants”

遵循以下代码:

代码语言:javascript
复制
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 } }

但是当我执行它时,会导致这个错误:无法读取'op':没有这样的变量

校验按钮是用变量命名的,但它是不可访问的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-19 13:46:57

您遇到的问题是,您正在一个过程中运行这段代码(很明智!)然而,回调脚本正在全局级别上进行评估;它们不是闭包,它们只是普通的旧脚本。

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

代码语言:javascript
复制
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命令很容易做到:

代码语言:javascript
复制
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只会执行任何必要的引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28607742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档