import gradio as gr import pandas as pd import random import json import os from datetime import datetime import matplotlib.pyplot as plt from gtts import gTTS # Ses üretim klasörü TEMP_SESLER_KLASORU = "temp_sesler" os.makedirs(TEMP_SESLER_KLASORU, exist_ok=True) # Ses üretici fonksiyon def ses_uret(kelime): yol = f"{TEMP_SESLER_KLASORU}/{kelime}.mp3" if not os.path.exists(yol): tts = gTTS(text=kelime, lang='en') tts.save(yol) return yol # Kelimeleri yükle tum_kelimeler = pd.read_csv("kelimeler.csv") # Her testte rasgele 15 kelime seç kelimeler = tum_kelimeler.sample(n=15).reset_index(drop=True) # Kullanıcı oturum verileri user_session = { "isim": "", "soru_index": 0, "dogru": 0, "yanlis": 0, "cevaplar": [] } SONUC_DOSYASI = "results.json" # Soru getirme fonksiyonu def get_soru(): idx = user_session["soru_index"] if idx >= 15: kaydet_sonuc() return "Test tamamlandı.", None, "", "", False satir = kelimeler.iloc[idx] ses_yolu = ses_uret(satir["english"]) return f"{idx+1}. Soru", ses_yolu, f"🔤 İngilizce: **{satir['english']}**", "", True # Test başlat def baslat(isim): if not isim.strip(): raise gr.Error("⚠️ Lütfen isminizi giriniz.") user_session["isim"] = isim user_session["soru_index"] = 0 user_session["dogru"] = 0 user_session["yanlis"] = 0 user_session["cevaplar"] = [] soru, ses, yazilis, _, _ = get_soru() return ( soru, # soru_kutusu gr.update(visible=False),# isim_input ses, # ses_kutusu yazilis, # kelime_gorunum gr.update(visible=True), # cevap_input gr.update(visible=True) # cevap_btn ) # Cevap kontrolü def kontrol_et(turkce_cevap): idx = user_session["soru_index"] satir = kelimeler.iloc[idx] dogru_mu = turkce_cevap.strip().lower() == satir["turkish"].lower() user_session["cevaplar"].append({ "soru": satir["english"], "cevap": turkce_cevap, "dogru_cevap": satir["turkish"], "dogru_mu": dogru_mu }) if dogru_mu: user_session["dogru"] += 1 geribildirim = "✅ Doğru!" else: user_session["yanlis"] += 1 geribildirim = f"❌ Yanlış! Doğru: {satir['turkish']}" user_session["soru_index"] += 1 soru, ses, yazilis, _, aktif = get_soru() return geribildirim, soru, ses, yazilis, "", aktif # Sonuç kaydet def kaydet_sonuc(): sonuc = { "isim": user_session["isim"], "dogru": user_session["dogru"], "yanlis": user_session["yanlis"], "zaman": datetime.now().isoformat() } if os.path.exists(SONUC_DOSYASI): with open(SONUC_DOSYASI, "r") as f: veriler = json.load(f) else: veriler = [] veriler.append(sonuc) with open(SONUC_DOSYASI, "w") as f: json.dump(veriler, f) # Öğretmen paneli def ogretmen_paneli(sifre): if sifre != "5555": return "❌ Hatalı şifre", None if not os.path.exists(SONUC_DOSYASI): return "Henüz kayıtlı veri yok.", None with open(SONUC_DOSYASI, "r") as f: veriler = json.load(f) df = pd.DataFrame(veriler) # Grafik oluştur plt.figure(figsize=(6,4)) plt.bar(df["isim"], df["dogru"], label="Doğru", color="green") plt.bar(df["isim"], df["yanlis"], bottom=df["dogru"], label="Yanlış", color="red") plt.xlabel("Öğrenci") plt.ylabel("Soru Sayısı") plt.title("Öğrenci Performansları") plt.legend() grafik_yolu = "grafik.png" plt.tight_layout() plt.savefig(grafik_yolu) plt.close() return "✅ Giriş başarılı", grafik_yolu # Gradio arayüzü with gr.Blocks() as demo: gr.Markdown("## 📚 İngilizce Kelime Testi (15 Soru)") with gr.Row(): isim_input = gr.Textbox(label="Adınızı girin") baslat_btn = gr.Button("Teste Başla") soru_kutusu = gr.Textbox(label="Soru", interactive=False, visible=True) ses_kutusu = gr.Audio(label="Kelimenin Telaffuzu", interactive=False, type="filepath") kelime_gorunum = gr.Markdown(visible=True) cevap_input = gr.Textbox(label="Türkçesini Yazınız", visible=False) cevap_btn = gr.Button("Cevabı Kontrol Et", visible=False) geribildirim = gr.Textbox(label="Geri Bildirim", interactive=False) # Bağlantılar baslat_btn.click( baslat, inputs=isim_input, outputs=[soru_kutusu, isim_input, ses_kutusu, kelime_gorunum, cevap_input, cevap_btn] ) cevap_btn.click( kontrol_et, inputs=cevap_input, outputs=[geribildirim, soru_kutusu, ses_kutusu, kelime_gorunum, cevap_input, cevap_btn] ) with gr.Accordion("👩‍🏫 Öğretmen Girişi", open=False): sifre = gr.Textbox(label="Şifre", type="password") sifre_btn = gr.Button("Giriş Yap") sonuc_mesaj = gr.Textbox(label="Durum", interactive=False) grafik = gr.Image() sifre_btn.click( ogretmen_paneli, inputs=sifre, outputs=[sonuc_mesaj, grafik] ) demo.launch()