在 tcl/tk 子窗口中,我无法为我的条目小部件设置默认值

Mic*_*oie 4 tk-toolkit tcl

我是 tcl/tk 世界的一个完整的初学者,但我已经尝试自己研究这个,并且一直空着。

我正在扩展一个 tcl/tk 应用程序,它允许我添加代码来生成一个子窗口并在那里做我需要做的事情。问题是,当我生成该窗口并尝试为我的条目小部件设置默认值时,它总是显示为空。

我已经创建了一个超简单的演示应用程序来复制这个:

#!/usr/local/bin/wish

set myvar1 "initial value 1"

entry .entry1 -textvariable myvar1
button .spawnchild -text "Spawn Child" -command "spawn_click"

pack .entry1 .spawnchild

proc spawn_click {} {
    set myvar2 "initial value 2"
    toplevel .lvl2
    entry .lvl2.entry2 -textvariable myvar2
    entry .lvl2.entry3 -textvariable myvar1
    pack .lvl2.entry2 .lvl2.entry3
}
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个窗口包含一个条目小部件,其默认值为“初始值 1”,并且显示正确。当我单击“Spawn Child”按钮时,会创建子窗口。如您所见,它包含两个堆叠的条目小部件。每个都有一个默认值,顶部的一个使用在它自己的范围内创建的默认值,底部的条目使用主程序范围内的默认值。

问题是顶部的输入字段由于某种原因没有显示它的默认值,而底部的输入字段很好。

多个弹出窗口

任何人都可以提供这种行为的解释以及如何让顶部条目小部件正确显示它的默认值吗?

编辑

谢谢 Andrew 和 schlenk,这似乎是 RTFM 的一个案例:) 我测试了你的全局建议,它按承诺工作。谢谢你让我直截了当!

sch*_*enk 5

阅读-textvariable选项的文档。变量名必须是全局(或完全限定的命名空间)变量名,但您的 myvar2 变量是局部变量。因此,您在 proc 中设置了一个与 textvariable 开关使用的变量不同的变量。

解决您的问题的一个简单方法是像这样编写 proc:

proc spawn_click {} {
    global myvar2
    set myvar2 "initial value 2"
    toplevel .lvl2
    entry .lvl2.entry2 -textvariable myvar2
    entry .lvl2.entry3 -textvariable myvar1
    pack .lvl2.entry2 .lvl2.entry3
}
Run Code Online (Sandbox Code Playgroud)

通过将 myvar2 显式声明为全局范围,您将在 -textvariable 绑定中使用相同的变量。


And*_*ein 5

myvar2需要在全球层面进行定义。定义spawn_click如下:

proc spawn_click {} {
   global myvar2;  # myvar2 is a global variable

   set myvar2 "initial value 2"
   toplevel .lvl2
   entry .lvl2.entry2 -textvariable myvar2
   entry .lvl2.entry3 -textvariable myvar1
   pack .lvl2.entry2 .lvl2.entry3
}
Run Code Online (Sandbox Code Playgroud)

你应该很好...

在此处输入图片说明