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



我对这方面非常陌生!

我使用的是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
"

谢谢你能提供的任何帮助!

您的代码有一些问题。此代码有效,并有望达到您的预期效果:

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)的内容将发生更改。

相关内容

  • 没有找到相关文章