Thank you to both John's! I have some testing (playing, actually) to do so I can better understand what is going on. You've both given me a lot to work through and I'm sure it will be a much better project when completed.
THANK YOU both very much. T ----- Original Message ----- From: "John McMonagle" <[EMAIL PROTECTED]> To: "Teresa Stanton" <[EMAIL PROTECTED]> Cc: <[email protected]> Sent: Monday, May 07, 2007 4:48 PM Subject: Re: [Tkinter-discuss] Canvas -> move object and remove previous location > # move the image by the difference between the last point > Teresa Stanton wrote: >> Hi all: >> I am working on a program that will take a .gif and move it from origin, >> along a path where the mouse clicks. I understand that the move is >> simply changing the coordinates. I can place several .gif's on the >> canvas, but I would like to make the previous image go away (delete or be >> removed) and thus far been unable to do that. The example program I wrote >> simply takes the image and moves it. I should mention that I've tried >> 'move() and coord()' to get the object to move, but I am not getting the >> effect I want. When I use move in successive steps it just appears at >> the last move coordinates. And when I try to use delete, well, it >> doesn't work, I get an error message. I should mention that I'm using >> python25. >> > Ok. You need to understand some of the Canvas methods better. > > Firstly the canvasx and canvasy methods translate screen coordinates from > your event to the Canvas coordinates. So when you generate a Button-1 > event, the event.x and event.y attributes need to be converted to your > Canvas x and y coordinates. > > x2 = canvas1.canvasx(event.x) > y2 = canvas1.canvasy(event.y) > > Second, you need to know what the coordinates are of your canvas image > object. This is where the coords method of the Canvas widget will help > you. But before you get the coordinates you need to know the object tag > or id. The easiest way to do this is to use the tags option when first > creating the tag. > > canvas1.create_image(x,y, image=photo, tags='myPhoto') > > Now, you can get the coordinates of this tag: > > x1, y1 = canvas1.coords('myPhoto') > > Thirdly, the move method of the Canvas widget moves the tag or id dx, dy > canvas units - it is a differential move. You could simply move the image > to the new coordinates by computing the difference between the original > x,y and the new x,y (as clicked): > > canvas1.move('myPhoto', x2-x1, y2-y1) > > However, you want to move the image to the clicked point in slow steps. > So, this will require you computing a stepped difference between the two > points, loop over the steps, moving the image, sleeping, then updating. > > Fourthly, the delete method of the Canvas widget deletes an item or tag > (but you don't need it here). > > canvas1.delete('myPhoto') > > The following code is pretty rough, but should illustrate some of the > concepts needed. It also doesn't handle the zero increment case. > > from Tkinter import * > import time > > root = Tk() > root.title("Click me!") > > def next_image(event): > # Convert the screen coordinates of the event to canvas coordinates > x2 = canvas1.canvasx(event.x) > y2 = canvas1.canvasy(event.y) > x2 = int(x2) > y2 = int(y2) > > # get the phot object coordinates > x1, y1 = canvas1.coords('myPhoto') > x1 = int(x1) > y1 = int(y1) > > # create two lists of stepped x and y > xinc = (x2 - x1)/100 > yinc = (y2 - y1)/100 > print xinc, yinc > xlist = [] > for x in xrange(x1, x2+xinc, xinc): > print x > xlist.append(x) > ylist = [] > for y in xrange(y1, y2+yinc, yinc): > print y > ylist.append(y) > > # move the image by the difference between the last point, sleep > # for half a millisecond, update the display > for i, x in enumerate(xlist): > if i == 0: > canvas1.move('myPhoto', x-x1, ylist[i]-y1) > else: > canvas1.move('myPhoto', x-xlist[i-1], ylist[i]-ylist[i-1]) > time.sleep(0.05) > root.update() > > image = "DustY1.GIF" # use any gif, this is a cartoon of my dog > photo = PhotoImage(file=image) > > # make canvas the size of image1/photo1 > width1 = photo.width() > height1 = photo.height() > canvas1 = Canvas(width=width1, height=height1) > canvas1.pack() > > # display photo, x, y is center > x = (width1)/2.0 > y = (height1)/2.0 > # this is the first image > canvas1.create_image(x, y, image=photo, tags='myPhoto') # added tags > option > > canvas1.bind('<Button-1>', next_image) # bind left mouse click > > root.mainloop() > > > Regards, > > John > > _______________________________________________ Tkinter-discuss mailing list [email protected] http://mail.python.org/mailman/listinfo/tkinter-discuss
