Загрузка данных


import random
from tkinter import *

WORDS = {
    "Приветствия": [("Hello","Привет"),("Bye","Пока"),("Thanks","Спасибо"),("Please","Пожалуйста")],
    "Животные": [("Cat","Кот"),("Dog","Собака"),("Bird","Птица"),("Fish","Рыба")],
    "Еда": [("Apple","Яблоко"),("Bread","Хлеб"),("Milk","Молоко"),("Cheese","Сыр")]
}

class App:
    def __init__(self, r):
        self.r=r;self.r.title("WordTrainer");self.r.geometry("500x400");self.r.config(bg="#1e1e2e")
        self.f=Frame(self.r,bg="#1e1e2e");self.f.pack(expand=1)
        self.menu()

    def clr(self):
        for w in self.f.winfo_children():w.destroy()

    def menu(self):
        self.clr()
        Label(self.f,text="WordTrainer",font="Arial 20 bold",bg="#1e1e2e",fg="#7aa2f7").pack(pady=20)
        for txt,cmd in[("Карточки",self.pick_cat),("Тест",self.pick_test)]:
            Button(self.f,text=txt,font="Arial 14",bg="#2d2d44",fg="white",command=cmd).pack(fill=X,padx=60,pady=5)

    def pick_cat(self):
        self.clr();self.mode="card";self.build_cat()

    def pick_test(self):
        self.clr();self.mode="test";self.build_cat()

    def build_cat(self):
        Label(self.f,text="Выберите категорию",font="Arial 14",bg="#1e1e2e",fg="white").pack(pady=10)
        for cat in WORDS:
            Button(self.f,text=cat,font="Arial 12",bg="#2d2d44",fg="white",command=lambda c=cat:self.start(c)).pack(fill=X,padx=80,pady=3)
        Button(self.f,text="Все категории",font="Arial 12",bg="#e0af68",fg="black",command=lambda:self.start("__all__")).pack(fill=X,padx=80,pady=3)

    def start(self,cat):
        self.pool=[w for lst in WORDS.values()for w in lst]if cat=="__all__"else list(WORDS[cat])
        random.shuffle(self.pool);self.idx=0;self.show=False;self.score=0
        if self.mode=="card":
            self.card_screen()
        else:
            self.test_pool=self.pool[:10]
            self.test_screen()

    def card_screen(self):
        self.clr()
        if self.idx>=len(self.pool):
            Label(self.f,text="Готово!",font="Arial 18",bg="#1e1e2e",fg="#9ece6a").pack(expand=1)
            Button(self.f,text="Меню",font="Arial 12",bg="#7aa2f7",command=self.menu).pack(pady=10);return
        en,ru=self.pool[self.idx]
        Label(self.f,text=f"{self.idx+1}/{len(self.pool)}",bg="#1e1e2e",fg="#c0caf5").pack()
        Label(self.f,text=en,font="Arial 24 bold",bg="#1e1e2e",fg="#7aa2f7").pack(pady=15)
        Label(self.f,text="???"if not self.show else ru,font="Arial 16",bg="#1e1e2e",fg="#c0caf5").pack()
        b=Frame(self.f,bg="#1e1e2e");b.pack(pady=15)
        Button(b,text="Перевод",font="Arial 12",bg="#7aa2f7",fg="white",command=self.flip).pack(side=LEFT,padx=5)
        Button(b,text="Знаю",font="Arial 12",bg="#9ece6a",command=lambda:self.nxt()).pack(side=LEFT,padx=5)
        Button(b,text="Учить",font="Arial 12",bg="#f7768e",fg="white",command=lambda:self.nxt()).pack(side=LEFT,padx=5)

    def flip(self):
        self.show=not self.show;self.card_screen()

    def nxt(self):
        self.show=False;self.idx+=1;self.card_screen()

    def test_screen(self):
        self.clr()
        if self.idx>=len(self.test_pool):
            p=int(self.score/len(self.test_pool)*100)
            Label(self.f,text=f"Результат: {self.score}/{len(self.test_pool)} ({p}%)",font="Arial 18",bg="#1e1e2e",fg="#9ece6a"if p>=60 else"#f7768e").pack(expand=1)
            Button(self.f,text="Меню",font="Arial 12",bg="#7aa2f7",command=self.menu).pack(pady=10);return
        en,_=self.test_pool[self.idx]
        Label(self.f,text=f"Вопрос {self.idx+1}/{len(self.test_pool)}",bg="#1e1e2e",fg="#c0caf5").pack()
        Label(self.f,text=en,font="Arial 22 bold",bg="#1e1e2e",fg="#7aa2f7").pack(pady=15)
        self.ent=Entry(self.f,font="Arial 14",justify="center",bg="#2d2d44",fg="white",insertbackground="white")
        self.ent.pack();self.ent.focus()
        self.ent.bind("<Return>",lambda e:self.chk())
        Button(self.f,text="Проверить",font="Arial 12",bg="#7aa2f7",fg="white",command=self.chk).pack(pady=10)

    def chk(self):
        _,ru=self.test_pool[self.idx]
        if self.ent.get().strip().lower()==ru.lower():self.score+=1
        self.idx+=1;self.test_screen()

r=Tk()
App(r)
r.mainloop()