For people who like to work with Tcl/Tk interactively, but don't like having to rerun their entire script when they fix one procedure (maybe because your script initializes variables you don't want to reinitialize), here is a little script that will let you redefine individual procedures on the fly.
namespace eval editonthefly { set window .edit proc edit {cmd} { variable window destroy $window if ![llength [info commands ::$cmd]] { puts "Error: $cmd not found." } else { toplevel $window entry $window.name -width 30 entry $window.args -width 30 text $window.body -width 60 -height 10 -relief raised -bd 1 frame $window.b grid $window.name $window.args -sticky we grid $window.body - -sticky news grid $window.b - -sticky w $window.name insert 0 $cmd $window.args insert 0 [info args ::$cmd] $window.body insert 1.0 [info body ::$cmd] grid columnconfigure $window 1 -weight 1 grid rowconfigure $window 1 -weight 1 button $window.b.cancel -text "Close" -command "destroy $window" button $window.b.save -text "Save" -command "editonthefly::Run" button $window.b.done -text "Save and Close" -command "editonthefly::Run; destroy $window" pack $window.b.cancel $window.b.save $window.b.done -side left } } proc Run {} { variable window set name [$window.name get] set args [$window.args get] set body [string trimright [$window.body get 1.0 end]] set s "proc ::$name {$args} {$body}" eval $s } } proc edit {cmd} {editonthefly::edit $cmd}
To use it, you can load this script, and then type "edit command" in the prompt to edit command. Pressing "Close" will close the window without altering the command, though it won't revert changes you made if you pressed Save before. Only one edit window can be open at a time.
--lihtox, 4Jun2012