Помогите с программированием, пожалуйста! (Python) Окно сразу закрывается
import tkinter as tk
from tkinter import messagebox
import os
root = tk.Tk()
root.title("Окно с иконкой")
# Правильный путь (один из вариантов):
icon_path = r"C:\Users\Ксения\Desktop\MyPythonProjects\Tkinter For Beginners\icon.ico"
# ИЛИ: icon_path = "C:/Users/Ксения/Desktop/MyPythonProjects/Tkinter For Beginners/icon.ico"
# ИЛИ: icon_path = "C:\\Users\\Ксения\\Desktop\\MyPythonProjects\\Tkinter For Beginners\\icon.ico"
try:
if os.path.exists(icon_path):
root.iconbitmap(icon_path)
else:
messagebox.showerror("Ошибка", f"Файл иконки не найден!\nПуть: {icon_path}")
except Exception as e:
messagebox.showerror("Ошибка", f"Не удалось загрузить иконку:\n{str(e)}")
root.mainloop()Платная нейронка ответила так:
-------------------------------------
Код в целом написан корректно, и окно не должно "сразу закрываться", если иконка загружена корректно или даже если её нет — в этом случае вызывается messagebox.showerror, но окно root всё равно должно остаться.
Однако есть одна тонкая проблема, из-за которой окно может закрываться мгновенно, особенно при отсутствии иконки или ошибке загрузки:
💥 Причина: messagebox не работает, пока окно не инициализировано (и может вызвать крах)
Tkinter требует, чтобы главное окно (root) было полностью "запущено" (инициализировано) перед вызовом messagebox. Иначе вызов messagebox.showerror в блоке try может сам по себе вызвать ошибку или завершить приложение, особенно если иконка не найдена.
✅ Решение: вызвать withdraw() до messagebox, а затем deiconify()
Вот исправленный код:
import tkinter as tk
from tkinter import messagebox
import os
root = tk.Tk()
root.title("Окно с иконкой")
# Прячем окно на время — чтобы messagebox мог появиться независимо
root.withdraw()
icon_path = r"C:\Users\Ксения\Desktop\MyPythonProjects\Tkinter For Beginners\icon.ico"
try:
if os.path.exists(icon_path):
root.iconbitmap(icon_path)
else:
messagebox.showerror("Ошибка", f"Файл иконки не найден!\nПуть: {icon_path}")
except Exception as e:
messagebox.showerror("Ошибка", f"Не удалось загрузить иконку:\n{str(e)}")
# После messagebox возвращаем окно
root.deiconify()
root.mainloop()
📌 Альтернатива — не использовать messagebox до mainloop
Если хочешь оставить всё как есть, просто не вызывай messagebox до запуска mainloop(), а, например, напечатай ошибку в консоль:
if not os.path.exists(icon_path):
print(f"Файл иконки не найден: {icon_path}")
else:
root.iconbitmap(icon_path)
🔍 Дополнительно: проверь
Что иконка действительно в формате .ico, а не .png, .jpg или переименованный файл.
Что путь к файлу не содержит кириллицу в имени пользователя, которая может вызывать ошибки в некоторых окружениях.
Спасибо огромное
Этот код не может просто закрыться, он обложен проверками и по логике обязан выдать либо окно, либо ошибку