################################################################# # draw elastic shapes on a canvas on drag, move on right click; # see canvasDraw_tags*.py for extensions with tags and animation ################################################################# from Tkinter import * trace = 0 class CanvasEventsDemo: def __init__(self, parent=None): canvas = Canvas(width=300, height=300, bg='beige') canvas.pack() canvas.bind('', self.onStart) # click canvas.bind('', self.onGrow) # and drag canvas.bind('', self.onClear) # delete all canvas.bind('', self.onMove) # move latest self.canvas = canvas self.drawn = None self.kinds = [canvas.create_oval, canvas.create_rectangle] def onStart(self, event): self.shape = self.kinds[0] self.kinds = self.kinds[1:] + self.kinds[:1] # start dragout self.start = event self.drawn = None def onGrow(self, event): # delete and redraw canvas = event.widget if self.drawn: canvas.delete(self.drawn) objectId = self.shape(self.start.x, self.start.y, event.x, event.y) if trace: print objectId self.drawn = objectId def onClear(self, event): event.widget.delete('all') # use tag all def onMove(self, event): if self.drawn: # move to click spot if trace: print self.drawn canvas = event.widget diffX, diffY = (event.x - self.start.x), (event.y - self.start.y) canvas.move(self.drawn, diffX, diffY) self.start = event if __name__ == '__main__': CanvasEventsDemo() mainloop()