Загрузка данных
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()