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()

Ответы (0 шт):