我在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
}
如您所见,第一个窗口包含一个条目窗口小部件,其默认值为“初始值1”并且正确显示。当我单击“Spawn Child”按钮时,将创建子窗口。如您所见,它包含两个堆叠的条目小部件。每个都有一个默认值,一个在顶部使用在其自己的范围内创建的默认值,底部的条目使用主程序范围中的默认值。
问题是顶部输入字段由于某种原因没有显示它的默认值,而底部输入字段确实很好。
任何人都可以提供此行为的说明以及如何让顶部条目小部件正确显示其默认值吗?
修改
感谢Andrew和schlenk,看来这是RTFM的一个案例:)我测试了你的全球建议,它按照承诺工作。谢谢你让我直截了当!
答案 0 :(得分:4)
阅读-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
}
通过明确声明myvar2为全局范围,您可以在-textvariable绑定中使用相同的变量。
答案 1 :(得分:4)
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
}
你应该好......