我非常擅长这个!
我正在使用tcl / tk,并希望让用户输入一个新的“名称”。新名称应存储在变量“name”中,但我收到一条错误消息(未知变量)。 $ name似乎不包含用户输入。你能看出我做错了吗?
entry .editname.newname -textvar name
pack .editname.newname
button .editname.save -text "Save" -command "
set character($id,1) $name
destroy .editname
"
感谢您提供任何帮助!
答案 0 :(得分:3)
您的代码存在一些问题。这段代码有效,希望能达到您的目的:
set id foo
frame .editname
pack .editname
entry .editname.newname -textvar name
pack .editname.newname
button .editname.save -text "Save" -command [list saveName $id]
pack .editname.save
proc saveName {id} {
set ::character($id,1) $::name
destroy .editname.newname
}
其中一个问题是窗口路径.editname
未定义(可能是您在未复制的代码中定义的?)。我通过添加具有该名称的框架来修复它。顺便说一句,您是否打算在命令中销毁条目小部件,留下按钮和窗口的其余部分?
另一个问题是您尝试在button
命令行上定义命令。这不是一个好主意,除非它是一个真正短而甜蜜的命令。最好在这里定义一个命令,比如saveName
,并在button
命令行上按名称引用它。
但是,变量name
存在于全局范围内,并且在saveName
命令中不可见。我们通过在proc
内的变量名称中添加一个双冒号来解决这个问题,告诉Tcl在全局范围内查找它。名为character
的变量也需要双冒号。变量id
也可以是全局变量,但是对于变量,我们可能希望将其值作为参数传递给saveName
命令。
当只是将没有参数的命令传递给命令选项时,比如按钮,我们只需要提到名称:
... -command myCmd
但是如果我们想在按钮激活它时将参数传递给它,我们需要将命令选项设置为一个列表(或带有空格的字符串,这在Tcl中几乎是一样的):
... -command {myCmd foo bar}
但是如果我们想要传递给命令的值是在变量内部或由命令生成,我们需要像这样编写它们:
... -command [list myCmd $myVar [myOtherCmd foo bar]]
记住参数将是设置命令选项时这些值的快照,而不是按下按钮(或其他)并激活命令的时间。
这将我们带回到您可能遇到的基本问题:您在创建按钮的位置为name
的成员分配了character
的值 ,这意味着你还没有在条目中写任何东西,所以变量还不存在。而且,即使已经设置了变量,单击该按钮也不会做任何事情,它只是将按钮创建时的变量值再次分配给数组。
如上定义,如果您更改name
变量的值(您必须手动执行,因为您刚刚销毁了条目小部件)并再次单击该按钮,{character($id,1)
的内容1}}已更改。