(Tcl/Tk) 如何更改复选按钮配置
(Tcl/Tk) How to change checkbutton configurations
我需要两个复选按钮,当 'op.invariants' 未选中时,必须禁用 'op.belief'。并且当 '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 } }
但是当我执行它时,导致这个错误:
无法读取 'op':没有这样的变量
checkbutton 以变量命名,但无法访问
您遇到的问题是您 运行 将这段代码放在一个过程中(明智地!),但回调脚本正在全局级别进行评估;这些不是闭包,它们只是普通的旧脚本。
解决方法是将回调代码放入以 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
将只做任何必要的引用。
我需要两个复选按钮,当 'op.invariants' 未选中时,必须禁用 'op.belief'。并且当 '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 } }
但是当我执行它时,导致这个错误: 无法读取 'op':没有这样的变量
checkbutton 以变量命名,但无法访问
您遇到的问题是您 运行 将这段代码放在一个过程中(明智地!),但回调脚本正在全局级别进行评估;这些不是闭包,它们只是普通的旧脚本。
解决方法是将回调代码放入以 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
将只做任何必要的引用。