proc tk_getString {w var title text} {
variable ::tk::Priv
upvar $var result
catch {destroy $w}
set focus [focus]
set grab [grab current .]
toplevel $w -bd 1 -relief raised -class TkSDialog
wm title $w $title
wm iconname $w $title
wm protocol $w WM_DELETE_WINDOW {set ::tk::Priv(button) 0}
wm transient $w [winfo toplevel [winfo parent $w]]
entry $w.entry -width 20
button $w.ok -bd 1 -width 5 -text Ok -default active -command {set ::tk::Priv(button) 1}
button $w.cancel -bd 1 -text Cancel -command {set ::tk::Priv(button) 0}
label $w.label -text $text
grid $w.label -columnspan 2 -sticky ew -padx 3 -pady 3
grid $w.entry -columnspan 2 -sticky ew -padx 3 -pady 3
grid $w.ok $w.cancel -padx 3 -pady 3
grid rowconfigure $w 2 -weight 1
grid columnconfigure $w {0 1} -uniform 1 -weight 1
bind $w <Return> {set ::tk::Priv(button) 1}
bind $w <Destroy> {set ::tk::Priv(button) 0}
bind $w <Escape> {set ::tk::Priv(button) 0}
wm withdraw $w
update idletasks
focus $w.entry
set x [expr {[winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 - [winfo vrootx $w]}]
set y [expr {[winfo screenheight $w]/2 - [winfo reqheight $w]/2 - [winfo vrooty $w]}]
wm geom $w +$x+$y
wm deiconify $w
grab $w
tkwait variable ::tk::Priv(button)
set result [$w.entry get]
bind $w <Destroy> {}
grab release $w
destroy $w
focus -force $focus
if {$grab != ""} {grab $grab}
update idletasks
return $::tk::Priv(button)
}
# Usage:
if {[tk_getString .valueDlg value "Dialog" "Please enter some text"]} {
#catch {console show}
#puts "user entered: $value"
pack [ label .l -text "User entered: '$value' " ]
}--AF 22-06-03updated on 23-06-03 on de's suggestion to set transient and restore previous grab
See also:

