Как перемещать объекты по диагонали в холсте Ткинтера? - PullRequest
0 голосов
/ 15 марта 2019

Как я могу заставить объект двигаться по диагонали на холсте Tkinter каждый раз, когда кто-то нажимает две клавиши со стрелками одновременно?Я создаю простую анимацию, но она движется только вверх, вниз, влево или вправо.Вот код, который у меня есть:

from tkinter import *
import time
root = Tk()
canvas = Canvas(root, width=800, height=800)
square = canvas.create_rectangle(0,0,50,50,outline='red')


def right(event):
 for i in range(5):
  canvas.move(ball,1,0)
  canvas.update()

def left(event):
 for i in range(5):
  canvas.move(ball,-1,0)
  canvas.update()

def down(event):
 for i in range(5):
  canvas.move(ball,0,1)
  canvas.update()

def up(event):
 for i in range(5):
  canvas.move(ball,0,-1)
  canvas.update()

root.bind('<Right>', right)
root.bind('<Left>', left)
root.bind('<Down>', down)
root.bind('<Up>', up)

canvas.pack()
root.mainloop()

1 Ответ

0 голосов
/ 21 апреля 2019

нажатия клавиш в tkinter - это отдельные события; за исключением модификаторов клавиш (shift, control, alt), вы не можете связать действие с «одновременным» нажатием двух клавиш.

То, что вы можете сделать, это назначить NE, SE, NW, SW перемещается на разные клавиши.

Я назначил управление движениями следующим клавишам:

Q W E
A   D
Z X C 

другие изменения:

  • Рекомендуется избегать импорта звезд.
  • Не нужно было update холст каждый раз; move уже перерисовывает изменения на холсте.
  • Я назначил объекту «скорость», удалил повторный вызов move в цикле и использовал скорость, чтобы определить расстояние для перемещения.
  • Я переименовал square в ball, поэтому ball определено.

код:

import tkinter as tk


root = tk.Tk()
canvas = tk.Canvas(root, width=800, height=800)
ball = canvas.create_rectangle(0, 0, 50, 50, outline='red')

speed = 5

def w(event):
    canvas.move(ball, speed, 0)

def e(event):
    canvas.move(ball, -speed, 0)

def s(event):
    canvas.move(ball, 0, speed)

def n(event):
    canvas.move(ball, 0, -speed)

def nw(e):
    canvas.move(ball, speed, -speed)

def sw(e):
    canvas.move(ball, speed, speed)

def ne(e):
    canvas.move(ball, -speed, -speed)

def se(e):
    canvas.move(ball, -speed, speed)

root.bind('<KeyPress-w>', n)
root.bind('<KeyPress-e>', nw)
root.bind('<KeyPress-d>', w)
root.bind('<KeyPress-c>', sw)
root.bind('<KeyPress-x>', s)
root.bind('<KeyPress-z>', se)
root.bind('<KeyPress-a>', e)
root.bind('<KeyPress-q>', ne)

canvas.pack()
root.mainloop()
...