pack [canvas .c -width 250 -height 250] .c create oval 25 25 225 225 -fill yellow -outline black -tag face#-- Mouth
.c create line 65 150 125 150 185 150 -width 5 -smooth 1 \ -fill red -tag mouth scale .c.1 -ori vert -length 200 -from -50 -to 100 \ -command {updateMouth .c} -showvalue 0 proc updateMouth {w val} { $w coords mouth [lreplace [$w coords mouth] 3 3 [expr {150+$val}]] } .c create window 240 125 -window .c.1#-- Eyebrows
.c create line 60 75 85 75 110 75 -tag brow -smooth 1 -width 3 .c create line 140 75 165 75 190 75 -tag brow -smooth 1 -width 3 scale .c.2 -ori vert -length 200 -from -25 -to 25 -showvalue 0 \ -command {updateBrows .c} proc updateBrows {w val} { foreach id [$w find withtag brow] { $w coords $id [lreplace [$w coords $id] 3 3 [expr {75+$val}]] } } .c create window 10 125 -window .c.2#-- Eyes
.c create oval 60 90 110 110 -fill white -outline white .c create oval 140 90 190 110 -fill white -outline white .c create oval 75 90 95 110 -fill black -tag iris .c create oval 155 90 175 110 -fill black -tag iris scale .c.3 -ori hori -length 200 -from -13 -to 13 -showvalue 0\ -command {updateIris .c} proc updateIris {w val} { set x 85 foreach id [$w find withtag iris] { foreach {x0 y0 x1 y1} [$w coords $id] break $w coords $id [list [expr {$x+$val-10}] $y0\ [expr {$x+$val+10}] $y1] incr x 80 } } .c create window 125 245 -window .c.3#-- Face color
.c bind face <1> { set color [tk_chooseColor] if {$color ne ""} {%W itemconfig face -fill $color} }
TV Great. I'm sure missed some hidden variables/sliders...