Ludwig Callewaert wrote in comp.lang.tcl, regarding a change-sensitive text widget:
All changes to the text widget are either done with the insert or delete text widget command. Overload these (by using Wcb for instance).
By overloading I mean that you provide a new implementation for those commands. In your case, the overloaded commands could first call the original insert or delete command and could then set a flag (a global variable for instance) indicating that the content of the text widget has changed. By putting a trace on that flag (with the trace command), you can make something happen everytime the widget content changes.
There are actually several ways to do this. One possibility is the following:
# Create the text widget pack [text .t] # The flag global flag set flag 0 # Put a trace on the flag to execute your proc trace add variable flag write changed # rename the widget procedure rename .t orig_t # the new widget procedure proc .t {args} { global flag set returnVal [eval [concat orig_t $args]] set command [lindex $args 0] if {[string equal $command "insert"] || [string equal $command "delete"]} { set flag 1 } return $returnVal } # Whatever you need to do when something changes proc changed {args} { puts "something changed" }
Wcb, the widget callback package which can be found at http://www.nemethi.de/ is a more general way to do this.