This was a Tcl/TK learning program to take a look at several things: * Canvas * Drag and Drop shapes onto a canvas * Create an image (.png) of that canvas ---- ====== #c1 - TCL/TK Learning about Canvas/photoimage #wjk@wjk.NOSPAMmv.com proc CanvasToPic { canvasID } { set returnThis [catch {package require Img} version] #Gets the contents of the canvas canvasID and put into photo image photoimage. set returnThis [catch {image create photo -format window -data $canvasID} photoimage] if { $returnThis != 0 } { puts "\nERROR: Cannot create photo!!!" exit 1 } return $photoimage } canvas .c1 -width 460 -height 350 -bg white -relief groove \ -borderwidth 4 grid .c1 -row 1 -column 1 -columnspan 2 frame .f1 button .f1.b1 -text "Selection Board" -command { .c1 create line 55 0 55 350 -width 2 for { set q 1 } { $q <= 21 } { incr q } { .c1 create rect 10 10 30 30 -fill red -tag movable .c1 create poly 30 10 30 30 50 30 -fill blue -tag movable -outline black .c1 create poly 30 10 50 10 50 30 -fill blue -tag movable -outline black .c1 create rect 10 30 30 50 -fill red -tag movable .c1 create poly 30 30 30 50 50 30 -fill blue -tag movable -outline black .c1 create poly 50 30 30 50 50 50 -fill blue -tag movable -outline black .c1 create rect 10 50 30 70 -fill blue -tag movable .c1 create poly 30 50 30 70 50 50 -fill red -tag movable -outline black .c1 create poly 50 50 30 70 50 70 -fill red -tag movable -outline black .c1 create rect 10 70 30 90 -fill blue -tag movable .c1 create poly 30 70 30 90 50 90 -fill red -tag movable -outline black .c1 create poly 30 70 50 70 50 90 -fill red -tag movable -outline black .c1 create rect 10 90 30 110 -fill green -tag movable .c1 create poly 30 90 30 110 50 110 -fill yellow -tag movable -outline black .c1 create poly 30 90 50 90 50 110 -fill yellow -tag movable -outline black .c1 create poly 30 50 30 70 50 50 -fill red -tag movable -outline black .c1 create poly 50 50 30 70 50 70 -fill red -tag movable -outline black .c1 create rect 10 110 30 130 -fill green -tag movable .c1 create poly 30 110 30 130 50 130 -fill yellow -tag movable -outline black .c1 create poly 30 110 50 110 50 130 -fill yellow -tag movable -outline black .c1 create rect 10 130 30 150 -fill yellow -tag movable .c1 create poly 30 130 30 150 50 130 -fill green -tag movable -outline black .c1 create poly 50 130 30 150 50 150 -fill green -tag movable -outline black .c1 create rect 10 150 30 170 -fill yellow -tag movable .c1 create poly 30 150 30 170 50 150 -fill green -tag movable -outline black .c1 create poly 50 150 30 170 50 170 -fill green -tag movable -outline black .c1 create rect 10 170 30 190 -fill lightgreen -tag movable .c1 create rect 30 170 50 190 -fill lightblue -tag movable .c1 create rect 10 190 30 210 -fill black -tag movable .c1 create rect 30 190 50 210 -fill white -tag movable -outline black .c1 create rect 10 210 30 230 -fill brown -tag movable .c1 create rect 30 210 50 230 -fill orange -tag movable -outline black .c1 create rect 10 230 30 250 -fill black -tag movable .c1 create rect 30 230 50 250 -fill white -tag movable -outline black .c1 create rect 10 250 30 270 -fill brown -tag movable .c1 create rect 30 250 50 270 -fill orange -tag movable -outline black .c1 create rect 10 270 30 290 -fill cyan -tag movable .c1 create rect 30 270 50 290 -fill grey -tag movable -outline black .c1 create rect 10 290 30 310 -fill magenta -tag movable .c1 create rect 30 290 50 310 -fill purple -tag movable -outline black .c1 create oval 10 310 30 330 -fill brown -tag movable .c1 create oval 30 310 50 330 -fill orange -tag movable -outline black .c1 create oval 10 330 30 350 -fill red -tag movable .c1 create oval 30 330 50 350 -fill blue -tag movable -outline black } .f1.b1 configure -state disabled } button .f1.b2 -text "Clear All" -command { .c1 delete all .f1.b1 configure -state normal } button .f1.b3 -text "MakePngImage" -command { set photoimage [CanvasToPic .c1] puts $photoimage puts "Writing photoimage in PNG format: photoimage.png" $photoimage write photoimage.png -format PNG } pack .f1.b1 -side left pack .f1.b2 -side left pack .f1.b3 -side left grid .f1 -row 2 -column 1 proc CanvasMarkIt { x y can } { global canvas $can raise current set x [$can canvasx $x] set y [$can canvasy $y] set canvas($can,obj) [ $can find closest $x $y ] set canvas($can,x) $x set canvas($can,y) $y } proc CanvasDragIt { x y can } { global canvas set x [$can canvasx $x] set y [$can canvasy $y] set dx [expr $x - $canvas($can,x)] set dy [expr $y - $canvas($can,y)] $can move $canvas($can,obj) $dx $dy set canvas($can,x) $x set canvas($can,y) $y } .c1 bind movable {CanvasMarkIt %x %y %W} .c1 bind movable {CanvasDragIt %x %y %W} ====== ---- ***Screenshots*** [wjk canvas drag-n-drop sample drag drop.png] [gold] added pix <> Example | Graphics