Top.Mail.Ru
Ответы

Помогите с программированием, пожалуйста! (Python) Окно сразу закрывается

123456789101112131415161718192021
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()
По дате
По рейтингу
Аватар пользователя
Гуру
8мес

Платная нейронка ответила так:
-------------------------------------
Код в целом написан корректно, и окно не должно "сразу закрываться", если иконка загружена корректно или даже если её нет — в этом случае вызывается messagebox.showerror, но окно root всё равно должно остаться.

Однако есть одна тонкая проблема, из-за которой окно может закрываться мгновенно, особенно при отсутствии иконки или ошибке загрузки:

💥 Причина: messagebox не работает, пока окно не инициализировано (и может вызвать крах)

Tkinter требует, чтобы главное окно (root) было полностью "запущено" (инициализировано) перед вызовом messagebox. Иначе вызов messagebox.showerror в блоке try может сам по себе вызвать ошибку или завершить приложение, особенно если иконка не найдена.

✅ Решение: вызвать withdraw() до messagebox, а затем deiconify()

Вот исправленный код:

123456789101112131415161718192021222324
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(), а, например, напечатай ошибку в консоль:

12345
if not os.path.exists(icon_path):
    print(f"Файл иконки не найден: {icon_path}")
else:
    root.iconbitmap(icon_path)

🔍 Дополнительно: проверь

  • Что иконка действительно в формате .ico, а не .png, .jpg или переименованный файл.

  • Что путь к файлу не содержит кириллицу в имени пользователя, которая может вызывать ошибки в некоторых окружениях.

Аватар пользователя
Ученик
8мес

Спасибо огромное

Аватар пользователя
Гуру
8мес

Этот код не может просто закрыться, он обложен проверками и по логике обязан выдать либо окно, либо ошибку



Видео по теме