Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите пж с Python

IrbisPro Мастер (2319), на голосовании 3 месяца назад
делаю змейку. сейчас, когда делаю game over появилась эта ошибка в терминале:
 Exception in Tkinter callback 
Traceback (most recent call last):
File "C:\Users\*****\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1948, in __call__
return self.func(*args)
^^^^^^^^^^^^^^^^
File "C:\Users\*****\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 861, in callit
func(*args)
File "C:\Users\*****\Desktop\змейка 2024\змейка 2024.py", line 105, in draw
root.bind('', move_up)
File "C:\Users\*****\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1448, in bind
return self._bind(('bind', self._w), sequence, func, add)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\*****\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1402, in _bind
self.tk.call(what + (sequence, cmd))
_tkinter.TclError: can't invoke "bind" command: application has been destroyed
функция:
 def game_over(): 
Window = Tk()
canvas = Canvas(Window, width = 350, height = 450)
canvas.pack()
canvas.create_text(100,80,text='GAME OVER',font="Verdana 12",fill="red")
root.destroy()

collision1 = canvas.find_overlapping(x1, y1, x2, y2)
if barrier in collision1:
game_over()
Голосование за лучший ответ
Sergio 2.1 Оракул (63896) 4 месяца назад
Судя по ошибке, проблема возникает из-за попытки привязки события к объекту 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()
Похожие вопросы