Reputation: 703
I'm trying to make a movable sprite in Tkinter; it works, but I'm not sure binding a Canvas with is the best solution. There is a delay after I press "w", for example, where the character moves once, stops for a few seconds, then starts moving a bit laggily.
Code:
import Tkinter as t
tk = t.Tk()
w = t.Button()
c = t.Canvas(tk, bg = "#000000", bd = 3)
x = 20
y = 20
img = t.PhotoImage(file = "hi.png")
c.create_image(x, y, image = img)
coord = 10, 50, 240, 210
def clearboard():
c.delete("all");
def key(event):
global y
global x
pr = event.char
if(pr is "w"):
y -= 5
if(pr is "s"):
y += 5
if(pr is "a"):
x -= 5
if(pr is "d"):
x += 5
c.delete("all");
c.create_image(x, y, image = img)
w = t.Button(tk, command = clearboard, activebackground = "#000000", activeforeground = "#FFFFFF", bd = 3, fg = "#000000", bg = "#FFFFFF", text = "Clear", relief="groove")
c.focus_set()
c.bind("<Key>", key)
w.pack()
c.pack()
tk.mainloop()
My question is, how do I remove that delay mentioned earlier and make the movement a bit smoother?
Thanks in advance.
Upvotes: 0
Views: 3049
Reputation: 703
Alright, I found an answer to my question. I just created a game loop and added a velx
variable, and added the bindings <KeyPress>
and <KeyRelease>
.
Code:
import Tkinter as t
tk = t.Tk()
w = t.Button()
c = t.Canvas(tk, bg = "#000000", bd = 3, width = 480, height = 360)
velx = 0
x = 240
img = t.PhotoImage(file = "hi.png")
c.create_image(x, 200, image = img)
def move():
global x
c.delete("all");
x += velx;
c.create_image(x, 200, image = img)
tk.after(10, move)
def clearboard():
c.delete("all");
def key_press(event):
global velx
pr = event.char
if(pr is "a"):
velx = -5
if(pr is "d"):
velx = 5
def key_release(event):
global velx
velx = 0
w = t.Button(tk, command = clearboard, activebackground = "#000000", activeforeground = "#FFFFFF", bd = 3, fg = "#000000", bg = "#FFFFFF", text = "Clear", relief="groove")
c.focus_set()
c.bind("<KeyPress>", key_press)
c.bind("<KeyRelease>", key_release)
move()
w.pack()
c.pack()
tk.mainloop()
Upvotes: 4