1from Tkinter import * 2 3# allows moving dots with multiple selection. 4 5SELECTED_COLOR = "red" 6UNSELECTED_COLOR = "blue" 7 8class Test(Frame): 9 ################################################################### 10 ###### Event callbacks for THE CANVAS (not the stuff drawn on it) 11 ################################################################### 12 def mouseDown(self, event): 13 # see if we're inside a dot. If we are, it 14 # gets tagged as CURRENT for free by tk. 15 16 if not event.widget.find_withtag(CURRENT): 17 # we clicked outside of all dots on the canvas. unselect all. 18 19 # re-color everything back to an unselected color 20 self.draw.itemconfig("selected", fill=UNSELECTED_COLOR) 21 # unselect everything 22 self.draw.dtag("selected") 23 else: 24 # mark as "selected" the thing the cursor is under 25 self.draw.addtag("selected", "withtag", CURRENT) 26 # color it as selected 27 self.draw.itemconfig("selected", fill=SELECTED_COLOR) 28 29 self.lastx = event.x 30 self.lasty = event.y 31 32 33 def mouseMove(self, event): 34 self.draw.move("selected", event.x - self.lastx, event.y - self.lasty) 35 self.lastx = event.x 36 self.lasty = event.y 37 38 def makeNewDot(self): 39 # create a dot, and mark it as current 40 fred = self.draw.create_oval(0, 0, 20, 20, 41 fill=SELECTED_COLOR, tags=CURRENT) 42 # and make it selected 43 self.draw.addtag("selected", "withtag", CURRENT) 44 45 def createWidgets(self): 46 self.QUIT = Button(self, text='QUIT', foreground='red', 47 command=self.quit) 48 49 ################ 50 # make the canvas and bind some behavior to it 51 ################ 52 self.draw = Canvas(self, width="5i", height="5i") 53 Widget.bind(self.draw, "<1>", self.mouseDown) 54 Widget.bind(self.draw, "<B1-Motion>", self.mouseMove) 55 56 # and other things..... 57 self.button = Button(self, text="make a new dot", foreground="blue", 58 command=self.makeNewDot) 59 60 message = ("%s dots are selected and can be dragged.\n" 61 "%s are not selected.\n" 62 "Click in a dot to select it.\n" 63 "Click on empty space to deselect all dots." 64 ) % (SELECTED_COLOR, UNSELECTED_COLOR) 65 self.label = Message(self, width="5i", text=message) 66 67 self.QUIT.pack(side=BOTTOM, fill=BOTH) 68 self.label.pack(side=BOTTOM, fill=X, expand=1) 69 self.button.pack(side=BOTTOM, fill=X) 70 self.draw.pack(side=LEFT) 71 72 def __init__(self, master=None): 73 Frame.__init__(self, master) 74 Pack.config(self) 75 self.createWidgets() 76 77test = Test() 78test.mainloop() 79