Вот версия, основанная на недавно удаленном ответе Маски Реблохона.Если он отправит свою собственную исправленную версию, я удалю эту.
import tkinter as tk
class Battlefield(tk.Canvas):
def __init__(self, master):
self.master = master
super().__init__(root, width=400, height=400)
self.pack()
tank = Tank(self)
self.bind('<Left>', tank.move)
self.bind('<Right>', tank.move)
self.bind('<Up>', tank.move)
self.bind('<Down>', tank.move)
class Tank:
OFFSETS = {'Left': (-1, 0), 'Right': (1, 0), 'Up': (0, -1), 'Down': (0, 1)}
def __init__(self, canvas):
self.canvas = canvas
self.id = self.canvas.create_rectangle(200, 200, 250, 250, outline='dark green', fill='dark green')
def move(self, event):
self.canvas.move(self.id, *Tank.OFFSETS[event.keysym])
if __name__ == '__main__':
root = tk.Tk()
battlefield = Battlefield(root)
battlefield.focus_set()
root.mainloop()
Конечно, вам не нужен класс для чего-то такого простого.
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()
tank = canvas.create_rectangle(200, 200, 250, 250, outline='dark green', fill='dark green')
OFFSETS = {'Left': (-1, 0), 'Right': (1, 0), 'Up': (0, -1), 'Down': (0, 1)}
def move(event):
canvas.move(tank, *OFFSETS[event.keysym])
canvas.bind('<Left>', move)
canvas.bind('<Right>', move)
canvas.bind('<Up>', move)
canvas.bind('<Down>', move)
canvas.focus_set()
root.mainloop()