Ошибка, когда tkinter завершает работу при использовании Pygame

Я пишу игру, используя pygame и tkinter, и когда я выхожу, используя крестик окна, он выдает ошибку (но все равно успешно завершает работу): _tkinter.TclError: не удается вызвать команду «обновить»: приложение было уничтожено Я хотел бы остановить это сообщение об ошибке Код, который выдает ошибку, — «root.update».

Я загрузил код на https://gist.github.com/spacejoey86/4be3c84a32195ede0f798d3527c12874#file-second-revision

Пожалуйста, уточните вашу конкретную проблему или добавьте дополнительные детали, чтобы выделить именно то, что вам нужно. В том виде, в котором он сейчас написан, трудно точно сказать, о чем вы спрашиваете. См. страницу Как спросить для уточнения этого вопроса.

stovfl 04.04.2019 19:30

вкратце: вы должны назначить/привязать к перекрестной функции окна, которая уничтожит окно и установит вашу собственную переменную is_tk_closed = True, а позже вы сделаете if not is_tk_closed: root.update(). Таким образом, root.update() будет выполняться только тогда, когда окно Tkinter все еще существует.

furas 04.04.2019 19:53

Пожалуйста, не ссылайтесь на код на другом сайте. В вашем вопросе должно быть достаточно кода, чтобы мы могли диагностировать проблему. Пожалуйста, редактировать вашего вопроса, чтобы включить минимальный воспроизводимый пример.

Bryan Oakley 04.04.2019 20:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны назначить функцию перекрестию окна, которая установит переменную (т.е. tk_open), а затем вы сможете использовать ее для выполнения root.update() только тогда, когда окно все еще существует.

Код основан на Tkinter: перехват удаления окна на effbot.org

Вы можете использовать root.protocol() или root.bind() — подробнее читайте на effbot.org

import tkinter as tk

def _delete_window():
    global tk_open

    print("delete_window")

    tk_open = False
    root.destroy()

def _destroy(event):
    global tk_open

    print("destroy")

    tk_open = False

root = tk.Tk()
root.protocol("WM_DELETE_WINDOW", _delete_window)
#root.bind("<Destroy>", _destroy)

tk_open = True

while tk_open:
    root.update()

Возможно, в вашем коде вам нужно будет только установить running == False вместо использования tk_open.

Спасибо, я пропустил глобальный бит.

SpaceJoey 15.04.2019 20:22

Другие вопросы по теме