135820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossumfrom Tkinter import *
235820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
335820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum# this file demonstrates the movement of a single canvas item under mouse control
435820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
535820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossumclass Test(Frame):
635820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    ###################################################################
735820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
835820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    ###################################################################
935820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    def mouseDown(self, event):
10182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        # remember where the mouse went down
11182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.lastx = event.x
12182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.lasty = event.y
1389cb67bb642ee958d9f095728c99e943e994ca54Guido van Rossum
1435820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    def mouseMove(self, event):
15182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        # whatever the mouse is over gets tagged as CURRENT for free by tk.
16182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.draw.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
17182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.lastx = event.x
18182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.lasty = event.y
1935820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
2035820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    ###################################################################
2135820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    ###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
2235820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    ###################################################################
2335820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    def mouseEnter(self, event):
2489cb67bb642ee958d9f095728c99e943e994ca54Guido van Rossum        # the CURRENT tag is applied to the object the cursor is over.
25182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        # this happens automatically.
26182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.draw.itemconfig(CURRENT, fill="red")
27182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2835820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    def mouseLeave(self, event):
29182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        # the CURRENT tag is applied to the object the cursor is over.
30182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        # this happens automatically.
31182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.draw.itemconfig(CURRENT, fill="blue")
3235820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
3335820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    def createWidgets(self):
34182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.QUIT = Button(self, text='QUIT', foreground='red',
35182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                           command=self.quit)
36182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.QUIT.pack(side=LEFT, fill=BOTH)
37182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.draw = Canvas(self, width="5i", height="5i")
38182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.draw.pack(side=LEFT)
3935820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
40182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        fred = self.draw.create_oval(0, 0, 20, 20,
41182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                     fill="green", tags="selected")
4235820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
43182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.draw.tag_bind(fred, "<Any-Enter>", self.mouseEnter)
44182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.draw.tag_bind(fred, "<Any-Leave>", self.mouseLeave)
4535820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
46182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Widget.bind(self.draw, "<1>", self.mouseDown)
47182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
4835820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
4935820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum    def __init__(self, master=None):
50182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Frame.__init__(self, master)
51182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Pack.config(self)
52182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.createWidgets()
5335820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossum
5435820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossumtest = Test()
5535820f77e41a8a41a695e08c041eed5e2e2ff3efGuido van Rossumtest.mainloop()
56