有没有办法让 ttk 小部件接受带有 $ 符号的变量?

Is there a way to let ttk widget accept variable with $ sign?

假设我有一个 ttk 单选按钮,我希望能够像

一样使用它
ttk::radiobutton .a$b -text -variable a$b

但只有命令路径“.a$b”按预期工作,变量部分“a$b”不工作。

有没有办法让它工作?

下面是演示问题的示例:

[lzhou@promote tcl]$ tclsh
% set a 1
1
% set b 0
0
% puts $a$b
10
% set a0 100
100
% puts a$b
a0
% puts ${a$b}
can't read "a$b": no such variable

O.K。我找到了答案:

% expr [join [concat "$" "a" $b] "" ]
100

调用“有效”,但您有一个变量,其名称是部分可变的。通常当你这样做时,最简单的方法是使用 数组变量 代替。

ttk::radiobutton .a$b -text -variable a($b)
# Note the (parentheses) above!
puts $a($b)

其他不太推荐的替代品

如果不是那样,那么读取变量的最佳技术要么使用 set 的单参数形式(实际上早于 $ 语法):

puts [set a$b]

或者使用固定名称为变量创建别名,使用 upvar 0:

upvar 0 a$b theVarAlias
puts $theVarAlias

如果您要对变量进行多次操作,则第二个选项更好,因为别名比一遍又一遍地查找变量名更有效。它们确实有更多的开销,所以它们对于一次性使用来说不是那么快。

我们不建议使用 exprsubst. 的计算表达式或其他奇怪的咒语来读取变量,这些在实践中太棘手了。太多奇怪的边缘情况。