Tkinter python. Не отображает картинки
Что не так с моим кодом? В режиме "Произношение" показывает правильный ответ, но когда я делаю неправильный ответ, то мне не отображает картинку с правильным
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
import random
import os
BLOCK_IMAGES_DIR = "C:\\Desktop\\randomIdeas\\אלפב'ת\\Block_letters_img"
CURSIVE_IMAGES_DIR = "C:\\Desktop\\randomIdeas\\אלפב'ת\\Handwritten_letters_img"
letters_dict = {
"א.png": "alef",
"ב.png": "bet",
"ג.png": "gimel",
"ד.png": "dalet",
"ה.png": "hei",
"ו.png": "vav",
"ז.png": "zayin",
"ח.png": "het",
"ט.png": "tet",
"י.png": "yud",
"כ.png": "kaf",
"ך.png": "а kaf",
"ל.png": "lamed",
"מ.png": "mem",
"ם.png": "f mem",
"נ.png": "nun",
"ן.png": "f nun",
"ס.png": "samekh",
"ע.png": "ayin",
"פ.png": "pei",
"ף.png": "f pei",
"צ.png": "tsadi",
"ץ.png": "f tsadi",
"ק.png": "kuf",
"ר.png": "resh",
"ש.png": "shin",
"ת.png": "tav"
}
class HebrewLetterQuiz:
def __init__(self, root):
self.root = root
self.root.title("Игра: Угадай букву иврита")
# Увеличение окна
self.root.geometry("800x600")
# Темная тема
self.root.configure(bg="#2e2e2e") # Цвет фона окна
# Выбор типа букв: печатные или прописные
self.letter_type = tk.StringVar(value="block")
self.mode = tk.StringVar(value="image")
font_large = ("Helvetica", 16) # Увеличенный шрифт
font_medium = ("Helvetica", 14)
# Создание фреймов для размещения элементов
self.left_frame = tk.Frame(root, bg="#2e2e2e")
self.left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=20, pady=20)
self.right_frame = tk.Frame(root, bg="#2e2e2e")
self.right_frame.pack(side=tk.RIGHT, fill=tk.Y, padx=20, pady=20)
# Выбор типа букв
self.block_radio = tk.Radiobutton(self.left_frame, text="Печатные", variable=self.letter_type, value="block",
command=self.load_new_letter, fg="white", bg="#2e2e2e", selectcolor="#404040", font=font_medium)
self.cursive_radio = tk.Radiobutton(self.left_frame, text="Прописные", variable=self.letter_type, value="cursive",
command=self.load_new_letter, fg="white", bg="#2e2e2e", selectcolor="#404040", font=font_medium)
self.block_radio.pack(anchor=tk.W, pady=10)
self.cursive_radio.pack(anchor=tk.W, pady=10)
# Режим отображения: изображение или произношение
self.image_mode_radio = tk.Radiobutton(self.right_frame, text="Изображение", variable=self.mode, value="image",
command=self.load_new_letter, fg="white", bg="#2e2e2e", selectcolor="#404040", font=font_medium)
self.pronunciation_mode_radio = tk.Radiobutton(self.right_frame, text="Произношение", variable=self.mode, value="pronunciation",
command=self.load_new_letter, fg="white", bg="#2e2e2e", selectcolor="#404040", font=font_medium)
self.image_mode_radio.pack(anchor=tk.W, pady=10)
self.pronunciation_mode_radio.pack(anchor=tk.W, pady=10)
# Канвас для отображения изображений
self.canvas = tk.Canvas(root, width=400, height=200, bg="#2e2e2e", highlightthickness=0)
self.canvas.pack(pady=20)
# Метка для отображения произношения
self.label = tk.Label(root, text="", fg="white", bg="#2e2e2e", font=font_large)
self.label.pack(pady=20)
# Поле ввода и кнопка
self.entry = tk.Entry(root, bg="#404040", fg="white", font=font_large, width=20, insertbackground="white")
self.entry.pack(pady=10)
self.button = tk.Button(root, text="Проверить", command=self.check_answer, bg="#404040", fg="white", font=font_medium)
self.button.pack(pady=10)
# Привязка нажатия клавиши Enter к функции check_answer
self.entry.bind("<Return>", self.check_answer)
self.load_new_letter()
def load_new_letter(self):
letter_type = self.letter_type.get()
mode = self.mode.get()
# Показ выбора типа букв в режиме произношения
if mode == "pronunciation":
self.left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=20, pady=20)
else:
self.left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=20, pady=20) # Показываем фрейм с выбором типа букв
image_dir = BLOCK_IMAGES_DIR if letter_type == "block" else CURSIVE_IMAGES_DIR
self.current_image, self.current_letter = random.choice(list(letters_dict.items()))
if mode == "image":
image_path = os.path.join(image_dir, self.current_image)
print(f"Загружаем изображение: {image_path}") # Отладка: печать пути
try:
self.image = Image.open(image_path)
self.photo = ImageTk.PhotoImage(self.image)
self.canvas.create_image(200, 100, image=self.photo)
self.label.config(text="")
except IOError:
print(f"Не удалось открыть изображение: {image_path}")
self.canvas.delete("all")
self.label.config(text="Ошибка загрузки изображения")
else:
self.canvas.delete("all")
self.label.config(text=self.current_letter)
def check_answer(self, event=None):
answer = self.entry.get().strip()
correct_answer = self.current_image[:-4] # Удаляем ".png" из имени файла для получения правильной буквы
correct_pronunciation = letters_dict[self.current_image] # Получаем произношение буквы
if answer == correct_answer:
messagebox.showinfo("Результат", "Правильно!")
else:
if self.mode.get() == "pronunciation":
self.canvas.delete("all")
image_path = os.path.join(BLOCK_IMAGES_DIR if self.letter_type.get() == "block" else CURSIVE_IMAGES_DIR, self.current_image)
# Отладка: печать пути изображения
print(f"Попытка открыть изображение: {image_path}")
try:
self.image = Image.open(image_path)
self.photo = ImageTk.PhotoImage(self.image)
self.canvas.create_image(200, 100, image=self.photo)
# Принудительное обновление интерфейса
self.canvas.update_idletasks()
self.label.config(text=f"Неправильно. Правильное звучание: {correct_pronunciation}")
except IOError:
print(f"Не удалось открыть изображение: {image_path}")
messagebox.showerror("Ошибка", f"Не удалось открыть изображение: {image_path}")
else:
messagebox.showinfo("Результат", f"Неправильно. Правильное звучание: {correct_pronunciation}")
self.entry.delete(0, tk.END)
self.load_new_letter()
if __name__ == "__main__":
root = tk.Tk()
quiz = HebrewLetterQuiz(root)
root.mainloop()