Python tkinter event advanced usage instance, pythontkinter
This example describes the advanced usage of Python tkinter events. We will share this with you for your reference. The details are as follows:
Let's take a look at the running effect:
Complete instance code:
# -*- coding:utf-8-*-#! python3from tkinter import *import threading, timetrace = 0class CanvasEventsDemo: def __init__(self, parent=None): canvas = Canvas(width=300, height=300, 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 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 = eventclass CanvasEventsDemoTags(CanvasEventsDemo): def __init__(self, parent=None): CanvasEventsDemo.__init__(self, parent) self.canvas.create_text(100, 8, text='Press o and r to move shapes') 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 guiclass 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(0.25) # pause this thread only def moveInSquares(self, tag): threading.Thread(self.moveEm, (tag,)).start()if __name__ == '__main__': CanvasEventsDemoThread() mainloop()