betaprojects / app_karteikasten_fortschritt.py
Lumosdev's picture
Upload 10 files
2ef45b1 verified
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()