如何将用户输入保存到tcl中的变量。我无法让它发挥作用

时间:2014-02-26 16:38:54

标签: variables textbox tcl user-input tk

我非常擅长这个!

我正在使用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
"

感谢您提供任何帮助!

1 个答案:

答案 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}}已更改。