Spaces:
Sleeping
Sleeping
| 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() | |