нажатия клавиш в 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()