Судя по ошибке, проблема возникает из-за попытки привязки события к объекту root, который был уничтожен вызовом root.destroy(). Когда происходит game_over(), вы уничтожаете root, а затем вызываете draw, который пытается снова привязать события к уже уничтоженному root.
Вот возможное решение проблемы. Вместо уничтожения root, вы можете скрыть или заморозить его и создать новое окно для отображения сообщения "GAME OVER". Также, чтобы избежать дальнейшего выполнения кода после завершения игры, включите проверку состояния игры.
Вот пример того, как можно изменить ваш код:
import tkinter as tk
def move_up(event):
# ваш код для движения вверх
pass
def draw():
global game_over_flag
if game_over_flag:
return
# ваш код для прорисовки
root.bind('', move_up)
# другие привязки событий
def game_over():
global game_over_flag
game_over_flag = True
game_over_window = tk.Toplevel(root)
game_over_window.title("Game Over")
canvas = tk.Canvas(game_over_window, width=350, height=450)
canvas.pack()
canvas.create_text(175, 225, text='GAME OVER', font="Verdana 12", fill="red")
# Отключаем привязки событий, если это необходимо
root.unbind('')
# Инициализация основного окна
root = tk.Tk()
game_over_flag = False
# ваш основной код игры
collision1 = canvas.find_overlapping(x1, y1, x2, y2)
if barrier in collision1:
game_over()
root.mainloop()