Как ускорить и замедлить объект во всех 4 направлениях в tkinter? - PullRequest
1 голос
/ 26 мая 2019

Я пытаюсь сделать куб способным ускоряться и замедляться во всех 4 направлениях с помощью клавиш со стрелками.Я смог решить это для 1 направления (вверх), но я не могу понять, как это сделать в другом 3. В основном мне просто нужно, чтобы он делал то, что делает мой текущий код, только во всех 4 направлениях.

from tkinter import *

SPEED = 1

def handle_key(event):
    sym = event.keysym
    print(sym)
    cdx, cdy = 0, 0
    if sym == 'Up':
        dy.set(dy.get()-SPEED)
    elif sym == 'Down':
        dy.set(SPEED)
    elif sym == 'Right':
        cdx = SPEED
    elif sym == 'Left':
        cdx = -SPEED
    dx.set(cdx)

def animate():
    canvas.move(player, dx.get(), dy.get())
    if dy.get() < 0:
        dy.set(min(dy.get() + .12, 0))
    canvas.after(1, animate)

root = Tk()
dx = DoubleVar()
dy = DoubleVar()


canvas = Canvas(root, width=800, height=600)
canvas.pack()

player = canvas.create_rectangle(395, 590, 405, 600, fill='red')


canvas.bind('<Key>', handle_key)
canvas.focus_set()
animate()
root.mainloop()

1 Ответ

0 голосов
/ 26 мая 2019

Ваш код имеет несколько проблем, например, функция animate() будет работать непрерывно, даже если нет события нажатия клавиши.Также код может быть намного лучше, как вы можете использовать <KeyPress> для ускорения и <KeyRelease> для замедления.Я создал пример того, что вы пытаетесь сделать.

enter image description here

Я использовал after(1,..) до ускорение и замедляется плавно, поскольку длительные нажатия клавиш имеют заметную задержку.

from tkinter import *

root = Tk()
root.geometry('1200x50+50+0')

speed = DoubleVar(value=1)    #  Speed of the item 
multiplier = DoubleVar(value=0.05)  #  Increase / Decrease rate
acc_id = None    # after id for acceleration
des_id = None    # after id for deceleration

canvas = Canvas(root, bg='pink')
canvas.pack(expand=1, fill='both')

#  Player item
player = canvas.create_rectangle(10,10,40,40, fill='grey', outline='black')

def direction(key):
    """Moves the item according to the arrow keys"""
    if key == 'Left': canvas.move(player, -speed.get()*multiplier.get(), 0)
    if key == 'Right': canvas.move(player, speed.get()*multiplier.get(), 0)
    # if key == 'Up': canvas.move(player, 0, -speed.get()*multiplier.get())
    # if key == 'Down': canvas.move(player, 0, speed.get()*multiplier.get())

def accelerate(evt=None):
    """Increase the speed."""
    global des_id, acc_id
    # set the values according to your needs
    multiplier.set( multiplier.get() + 0.05 )
    direction(evt.keysym)
    if des_id: canvas.after_cancel(des_id)
    acc_id = canvas.after(1, accelerate, evt)

def decelerate(evt=None):
    """Decrease the speed."""
    global des_id, acc_id
    if acc_id: canvas.after_cancel(acc_id)
    # set the values according to your needs
    multiplier.set( multiplier.get() - 0.05 )
    if multiplier.get() >= 0: 
        direction(evt.keysym)
        des_id = canvas.after(1, decelerate, evt)

root.bind('<KeyPress>', accelerate)
root.bind('<KeyRelease>', decelerate)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...