import gradio as gr import json import random import matplotlib.pyplot as plt # ---- Karteikasten-Logik (Leitner-System) ---- DATEI = "karteikarten.json" def lade_karteikarten(): with open(DATEI, "r", encoding="utf-8") as f: return json.load(f) def speichere_karteikarten(karten): with open(DATEI, "w", encoding="utf-8") as f: json.dump(karten, f, indent=2, ensure_ascii=False) def naechste_karte(karten): gewichtet = [] for karte in karten: gewicht = 6 - karte["stufe"] gewichtet += [karte] * gewicht return random.choice(gewichtet) if gewichtet else None def verarbeite_antwort(karte, antwort_index, alle_karten): korrekt = (antwort_index == karte["richtig"]) if korrekt: karte["stufe"] = min(karte["stufe"] + 1, 5) else: karte["stufe"] = 1 speichere_karteikarten(alle_karten) return korrekt, karte["stufe"] def erstelle_fortschrittsgrafik(karten): stufen = [1, 2, 3, 4, 5] anzahl_karten = [sum(1 for k in karten if k["stufe"] == s) for s in stufen] plt.figure(figsize=(8, 5)) plt.bar(stufen, anzahl_karten) plt.xlabel("Lernstufe") plt.ylabel("Anzahl Karteikarten") plt.title("Karteikarten-Fortschritt") plt.xticks(stufen) plt.grid(axis="y") pfad = "karteikasten_fortschritt.png" plt.savefig(pfad) plt.close() return pfad # ---- Gradio-App ---- karten = lade_karteikarten() aktuelle_karte = naechste_karte(karten) def quiz(antwort_index): global aktuelle_karte, karten if aktuelle_karte is None: return "Alle Karten gelernt!", "", [] korrekt, neue_stufe = verarbeite_antwort(aktuelle_karte, antwort_index, karten) text = "✅ Richtig!" if korrekt else "❌ Leider falsch." feedback = f"{text} Diese Karte ist jetzt in Stufe {neue_stufe}." aktuelle_karte = naechste_karte(karten) if aktuelle_karte: return feedback, aktuelle_karte["frage"], aktuelle_karte["antworten"] else: return "Du hast alle Karten durch!", "", [] def zeige_fortschritt(): pfad = erstelle_fortschrittsgrafik(karten) return pfad with gr.Blocks() as demo: gr.Markdown("# 📚 Karteikarten-Lernen – §34a Leitner-System") frage = gr.Textbox(label="Frage", value=aktuelle_karte["frage"] if aktuelle_karte else "", interactive=False) feedback = gr.Textbox(label="Feedback", interactive=False) btns = gr.Radio(aktuelle_karte["antworten"] if aktuelle_karte else [], label="Antwort wählen") weiter = gr.Button("Antwort prüfen") weiter.click(fn=quiz, inputs=btns, outputs=[feedback, frage, btns]) gr.Markdown("## 📊 Fortschritt") zeige_btn = gr.Button("Fortschritt anzeigen") fortschritt_img = gr.Image() zeige_btn.click(fn=zeige_fortschritt, inputs=None, outputs=fortschritt_img) demo.launch()