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: