Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Tk_thread_ani.py
- from Tkinter import *
- import thread, time
- trace = 0
- howto = 'XY Drag on screen to create circles and rectangles\nPress o and r to move them as by shape'
- class CanvasEventsDemo:
- def __init__(self, parent=None):
- canvas = Canvas(width=600, height=600, bg='beige')
- canvas.pack()
- canvas.bind('<ButtonPress-1>', self.onStart) # click
- canvas.bind('<B1-Motion>', self.onGrow) # and drag
- canvas.bind('<Double-1>', self.onClear) # delete all
- canvas.bind('<ButtonPress-3>', 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
- self.canvas.create_text(300, 30, text=howto)
- 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
- class CanvasEventsDemoTags(CanvasEventsDemo):
- def __init__(self, parent=None):
- CanvasEventsDemo.__init__(self, parent)
- self.canvas.create_text(300, 30, text=howto)
- self.canvas.master.bind('<KeyPress-o>', self.onMoveOvals)
- self.canvas.master.bind('<KeyPress-r>', self.onMoveRectangles)
- self.kinds = self.create_oval_tagged, self.create_rectangle_tagged
- def create_oval_tagged(self, x1, y1, x2, y2):
- objectId = self.canvas.create_oval(x1, y1, x2, y2)
- self.canvas.itemconfig(objectId, tag='ovals', fill='blue')
- return objectId
- def create_rectangle_tagged(self, x1, y1, x2, y2):
- objectId = self.canvas.create_rectangle(x1, y1, x2, y2)
- self.canvas.itemconfig(objectId, tag='rectangles', fill='red')
- return objectId
- def onMoveOvals(self, event):
- print 'moving ovals'
- self.moveInSquares(tag='ovals') # move all tagged ovals
- def onMoveRectangles(self, event):
- print 'moving rectangles'
- self.moveInSquares(tag='rectangles')
- def moveInSquares(self, tag): # 5 reps of 4 times per sec
- for i in range(5):
- for (diffx, diffy) in [(+20, 0), (0, +20), (-20, 0), (0, -20)]:
- self.canvas.move(tag, diffx, diffy)
- self.canvas.update() # force screen redraw/update
- time.sleep(0.25) # pause, but don't block gui
- class CanvasEventsDemoThread(CanvasEventsDemoTags):
- def moveEm(self, tag):
- for i in range(5):
- for (diffx, diffy) in [(+20, 0), (0, +20), (-20, 0), (0, -20)]:
- self.canvas.move(tag, diffx, diffy)
- time.sleep(1.0) # pause this thread only
- def moveInSquares(self, tag):
- thread.start_new_thread(self.moveEm, (tag,))
- if __name__ == '__main__':
- CanvasEventsDemoThread()
- mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement