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] } }