[Richard Suchenwirth] -- Anne Lavergne wrote in ''news:comp.lang.tcl'' : > I am looking for a spreadsheet-like Tk widget i.e. 2D array of canvases > (cells) to implement a chessboard. Couldn't resist - here is a one-canvas solution, with movable checkers [[BE: draughts]] pieces: set dx 50 set dy 50 set colors {black white red blue} pack [canvas .c -width [expr $dx*8] -height [expr $dy*8]] -fill both -expand 1 .c bind all <1> {set c(X) [.c canvasx %x]; set c(Y) [.c canvasy %y]} .c bind mv {mv %x %y} proc mv {x y} { global c set x [.c canvasx $x]; set y [.c canvasy $y] set id [.c find withtag current] .c move $id [expr {$x-$c(X)}] [expr {$y-$c(Y)}] .c raise $id set c(X) $x; set c(Y) $y } set color 0 proc makepiece {x y color args} { global dx dy .c create oval [expr {$x+2}] [expr {$y+2}] [expr {$x+$dx-3}] [expr {$y+$dy-3}] \ -fill $color -tags [concat $args mv] } proc makecheck {x y color args} { global dx dy .c create rectangle $x $y [expr {$x+$dx}] [expr {$y+$dy}] \ -fill $color -tags $args } for {set i 0; set y 0} {$i<8} {incr i; incr y $dy} { for {set j 0; set x 0} {$j<8} {incr j; incr x $dx} { makecheck $x $y [lindex $colors $color] if {$i<2} { makepiece $x $y [lindex $colors 2] player2 } if {$i>5} { makepiece $x $y [lindex $colors 3] player1 } set color [expr {1-$color}] } set color [expr {1-$color}] } In C/Motif, I'd not even have thought of writing something like this.. With Tcl, I come home after a real long working day and think "Wouldn't it be nice to also have a [Nine Men Morris]? [A little Go board]?" and after a long evening, here they are! ---- [Bryan Oakley] writes... I updated the above to draw the checkers a little bit inside the borders. Also, the following binding will make the checkers snap to a particular square. I'm sure somebody can improve on the efficiency of the solution. .c bind mv {drop [.c find withtag current]} proc drop {id} { global c dx dy set cx0 [expr {int($c(X) / $dx) * $dx + 2}] set cy0 [expr {int($c(Y) / $dy) * $dy + 2}] set cx1 [expr {$cx0 + $dx - 3}] set cy1 [expr {$cy0 + $dy - 3}] .c coords $id $cx0 $cy0 $cx1 $cy1 } ''DKF'' - I've improved the efficiency slightly, but there really isn't much point in doing much better, as it only has to deal with responses to bindings.