Treeschapter
Treeschapter

Reputation: 48

Canvas.Move doesn't work

def moveR(amount):
   global x
   global y
   x = x+amount
   can.itemconfig(player, image = playerImageL)
   can.move("player", x, y)
   root.update()

##SETTING##

can = Canvas(width = 850, height = 550, bg = "black")
can.pack(expand = YES, fill = BOTH)

player = can.create_image(x, y, image = playerImageL, anchor = NW)
root.update()

Hey, i am trying to create a mini game using tkinter and canvas however the move command doesn't work. As you see the SETTING is the setup later in the code i am calling

moveR(100)

however it doesn't work and seems to completly destroy my sprite/image.

Upvotes: 2

Views: 1129

Answers (2)

Terry Jan Reedy
Terry Jan Reedy

Reputation: 19219

Please read https://stackoverflow.com/help/mcve. To make the code easily verifiable, use something like a rectangle instead of an image. (Your code fails the same for any item.)

Canvas.move(item, delta_x, delta_y) moves the item a given x and y amount. It does the x + dy calculation itself, so you should not. If you want to move to a given position, use Canvas.coords(item, x0, y0, x1, y1). If the size of the new bounding box is different from what it was, it will also change the shape. The following example uses both methods. As a bonus, it also shows how to use root.after to make repeated changes.

import tkinter as tk
root = tk.Tk()
can = tk.Canvas(root, width=800, height=500)
can.pack()
rec = can.create_rectangle(0, 0, 100, 100, fill='red')
def rmove():
    box = can.bbox(rec)
    if box[0] < 700:
        can.move(rec, 100, 30)
        root.after(1000, rmove)
    else:
        can.coords(rec, 0, 400, 50, 500)  # position with new shape
root.after(1000, rmove)
root.mainloop()

Upvotes: 1

furas
furas

Reputation: 143098

Text "player" and variable player are two different things.

Use variable player in move()

can.move(player, x, y)

BTW: you don't need itemconfig()

Upvotes: 2

Related Questions