Tak jsem si konečně našel čas pro vypracování toho příkladu. Může to vypadat například následovně (pro jednoduchost to kreslí jenom úsečky, ale rozšíření na další typy je přímočaré). Ještě pro vysvětlení: v případě, že se stlačí tlačítko myši, zapamatuje se pozice kurzoru a nastaví se globální proměnná button (protože motion reaguje i na pohyb bez tlačítka). Potom už stačí na pohyb reagovat tak, že se pracovní úsečka smaže a vytvoří se nová. Identifikátor úsečky si pamatuji v proměnné usecka. Šlo by to řešit i tak, že se překonfigurují parametry stávající úsečky (aby se nemusela mazat a vytvářet), ale toto je přehlednější. Pracovní úsečka se vykresluje červeně, to zajistí parametr -fill red.
#!/usr/bin/wish
# Jednoduchý grafický editor založený na widgetu canvas
# přidána "gumová" úsečka
# globální proměnné
set x1 0
set y1 0
set usecka 0
set button 0
# kontejner pro vkládání dalších widgetů
frame .editor
# plátno, na které se bude kreslit
canvas .editor.platno -width 512 -height 384
# vložení všech widgetů do okna aplikace
pack .editor
pack .editor.platno
# navázání událostí od myši
bind .editor.platno <buttonpress-1> { start %x %y }
bind .editor.platno <buttonrelease-1> { stop %x %y }
bind .editor.platno <motion> { motion %x %y }
# procedura, která je zavolána v případě,
# že uživatel stlačí levé tlačítko myši
proc start { x y } {
# zapamatování polohy kurzoru myši
global x1
global y1
global button
global usecka
set x1 $x
set y1 $y
set button 1
# set usecka [.editor.platno create line $x $y $x $y -fill red]
}
# procedura, která je zavolána v případě,
# že uživatel pustí levé tlačítko myši
proc stop { x y } {
global x1
global y1
global button
set button 0
.editor.platno create line $x1 $y1 $x $y
}
# procedura, která je zavolána v případě,
# že uživatel pohybuje korzorem myši
proc motion { x y } {
global x1
global y1
global button
global usecka
if ($button) {
.editor.platno delete $usecka
set usecka [.editor.platno create line $x1 $y1 $x $y -fill red]
}
}