简体   繁体   中英

Smooth movement with Tkinter?

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.

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()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM