if 0 { Limitations: text images and windows are not saved. nothing in a canvas is saved. a toplevels wm attributes (resizable, toolwindow, aspect, etc) are not saved. listbox item configurations, text tags and marks can get quite slow if you have large listboxes or many tags Usage example: set state [serialize .frame] destroy .frame toplevel .frame eval [join $state \;] --[AF] 23-06-03 } proc serialize {w} { upvar state state foreach c [winfo children $w] { if {[string match .#* $c]} {continue} set new $c if {[catch {$c configure -class} widget]} {set widget "{} {} {} [winfo class $c]"} set widget [string tolower [lindex $widget 3]] lappend state "$widget $new [getconfig $c]" if {$widget == "listbox"} { lappend state "$new insert 0 [$c get 0 end]" set len [$c index end] for {set x 0} {$x < $len} {incr x} { if {[set config [getconfig $c "itemconfigure $x"]] != " "} { lappend state "$new itemconfigure $x $config" } } } elseif {$widget == "entry"} { lappend state "$new configure -state normal" lappend state "$new insert 0 [list [$c get]]" lappend state "$new configure -state [$c cget -state]" } elseif {$widget == "text"} { lappend state "$new configure -state normal" lappend state "$new insert 1.0 [list [$c get 1.0 end-1c]]" lappend state "$new delete end end-1l" lappend state "addtags $new [list [$c dump -tag 1.0 end]]" foreach x [$c tag names] { lappend state "$new tag configure $x [getconfig $c "tag configure $x"]" if {[set bindings [$c tag bind $x]] != ""} { foreach b $bindings {lappend state "$new tag bind $x $b [list [$c tag bind $x $b]]"} } } lappend state [string map "mark \"\;$new mark set\"" [$c dump -mark 1.0 end]] lappend state "$new configure -state [$c cget -state]" } elseif {$widget == "menu"} { set end [$c index end] for {set x 0} {$x <= $end} {incr x} { lappend state "$new add [$c type $x] [getconfig $c "entryconfigure $x"]" } } lappend state "bindtags $new [list [bindtags $c]]" if {[set bindings [bind $c]] != ""} { foreach x $bindings {lappend state "bind $new $x [list [bind $c $x]]"} } if {[winfo children $c] != ""} {serialize $c} } set manager {} foreach x [winfo children $w] { if {[set manager [winfo manager $x]] != ""} {break} } if {$manager == "grid" || $manager == "pack" || $manager == "place"} { foreach x [$manager slaves $w] {lappend state "$manager $x [lrange [$manager info $x] 2 end]"} } elseif {$manager == "panedwindow"} { foreach x [$w panes] {lappend state "$w add $x [getconfig $w "paneconfigure $x"]"} } set grid [grid size $w] if {[set cols [lindex $grid 0]] > 0} { for {incr cols -1} {$cols > -1} {incr cols -1} { lappend state "grid columnconfigure $w $cols [grid columnconfigure $w $cols]" } } if {[set rows [lindex $grid 1]] > 0} { for {incr rows -1} {$rows > -1} {incr rows -1} { lappend state "grid rowconfigure $w $rows [grid rowconfigure $w $rows]" } } return $state } proc getconfig {w {cmd configure}} { set args {} foreach x [eval $w $cmd] { if {[set opt [lindex $x 4]] != [lindex $x 3]} {lappend args [list [lindex $x 0] $opt]} } return [join $args] } proc addtags {w tags} { foreach {d tag pos} $tags { if {$d == "tagon"} { set t($tag) $pos } elseif {$d == "tagoff" && [info exists t($tag)] && $t($tag) != ""} { $w tag add $tag $t($tag) $pos unset t($tag) } } } ---- This might be another good candidate for [tklib]. ---- [Category GUI] | [Tk]