还是新手,我为自己创造了一个有趣的问题,我无法解决......
我正在尝试设计自己的“弹出式”框,允许用户编辑现有的字符串。按下按钮时会弹出它,在输入框中显示该字符串。一旦用户编辑了字符串(或不编辑),他就会点击“确定”按钮然后消失,脚本现在应该有新的字符串。
我的方法是这样的:
按下按钮,创建一个带有三个小部件的顶层窗口:
我有点工作,但无法弄清楚如何获得编辑过的字符串。
我意识到我的根本问题是我不是在考虑“事件驱动”的术语。看起来这应该很容易,但我现在看不到森林了。
我错过了什么?我是不是太复杂了?
#!/usr/bin/wish
# Create the Pop-up box
proc popUpEntry { labelString } {
global myString
puts "POP:myString = $myString"
set top [toplevel .top]
set labelPop [label $top.labelPop -text $labelString ]
set entryPop [entry $top.entryPop -bg white -width 20 -textvar $myString ]
set buttonPop [button $top.buttonPop -text "Ok" -command { destroy .top } ]
pack $labelPop
pack $entryPop
pack $buttonPop
}
# Pop-up command
proc DoPop {} {
global myString
set popUpLabel "Edit string, press ok when done:"
puts "Before: myString = $myString"
popUpEntry $popUpLabel
puts "After: myString = $myString"
}
# Initalize
set myString "String at start"
# Pop-up button invokes the pop-up command
set buttonPop [button .buttonPop -width 10 -text "Pop" -command {DoPop} ]
pack $buttonPop
#
答案 0 :(得分:2)
在这一行:
set entryPop [entry $top.entryPop -bg white -width 20 -textvar $myString ]
您要将entry
控件的-textvar
设置为变量myString
的内容。
您应该通过删除$
符号将其设置为变量:
set entryPop [entry $top.entryPop -bg white -width 20 -textvar myString ]
答案 1 :(得分:0)
除了-textvar $ myString之外,代码将无效,因为popUpEntry函数将在创建弹出窗口后立即返回 - 在用户有机会输入新内容之前。
你必须等待弹出窗口关闭。这可以使用popUpEntry中的另一个全局变量来完成:
...
global popup_closed
...
set buttonPop [button $top.buttonPop -text "Ok" -command {
set edit_ready 1
destroy .top
}
...
set edit_ready 0
popUpEntry $popUpLabel
vwait edit_ready