twgrops--- via Python-list wrote: > Hi I am new here and to python, > > I am currently studying towards my degree in computer science and have to > build a program but I have hit a brick wall. I am trying to make an image > move around the canvas. I can make a rectangle move using the following: > > #test rectangle > id1=canvas.create_rectangle(3,7,3+10,7+10) > > # Generate x and y coordinates for 500 timesteps > for t in range(1, 500): > > x1,y1,x2,y2=canvas.coords(id1) > > # If a boundary has been crossed, reverse the direction > if x1 >= x_max: > vx = -10.0 > if y1 <= y_min: > vy = 5.0 > if y2 >= y_max: > vy = -5.0 > if x1 <= x_min: > vx = 10.0 > > # Reposition the robot > canvas.coords(id1,x1+vx,y1+vy,x2+vx,y2+vy) > canvas.update() > > # Pause for 0.1 seconds, then delete the image > time.sleep(0.1)
You should never use sleep() in conjunction with tkinter. Instead make a little function that schedules itself for invocation after a few milliseconds: def move(): ... # move sprits root.after(100, move) # have tkinter call move() # again after 100 milliseconds That way the event loop is undisturbed and the application can respond to user input. > However i would like my image/sprite to move around: > > objecttank=canvas.create_image(950,650,image=gif6, anchor= NW) > > from what i gather it is because an image only has two axis, x and y but > the rectangle seems to have 4 values, my error code keeps saying expecting > 4 but got 2. Always provide the exact code causing the error, and the traceback it generated. Use copy and paste instead of paraphrasing. > Can anyone help me in the right direction, many thanks tom. I think I have done this before, but cannot find it atm, so instead of a link here's a new demo: try: import tkinter as tk except ImportError: import Tkinter as tk import random WIDTH = 1024 HEIGHT = 768 def random_speed(): return random.choice([-1, 1]) * random.randrange(5, 15) def random_image(canvas, image): """Place `image` on `canvas` with random pos and speed. """ return Image( canvas, image, random.randrange(WIDTH-image.width()), random.randrange(HEIGHT-image.height()), random_speed(), random_speed(), ) class Image(object): def __init__(self, canvas, image, x, y, vx, vy): self.canvas = canvas self.image = image self.x = x self.y = y self.vx = vx self.vy = vy self.w = image.width() self.h = image.height() self.id = canvas.create_image(x, y, image=image, anchor=tk.NW) @property def right(self): return self.x + self.w @property def bottom(self): return self.y + self.h def move(self): self.x += self.vx self.y += self.vy self.canvas.move(self.id, self.vx, self.vy) if self.bottom > HEIGHT or self.y < 0: self.vy = - self.vy if self.right > WIDTH or self.x < 0: self.vx = - self.vx def move(): for image in images: image.move() root.after(50, move) if __name__ == "__main__": root = tk.Tk() ball = tk.PhotoImage(file="ball.gif") canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT) canvas.pack() images = [random_image(canvas, ball) for _ in range(10)] move() root.mainloop() -- https://mail.python.org/mailman/listinfo/python-list