Spaces:
Sleeping
Sleeping
import gradio as gr import random import time import threading # ---------------- Dictionary y'ibibazo n'ibisubizo ---------------- ibisubizo_dict = { "Icyapa cya STOP gisobanura iki?": ( "Ugomba guhagarara neza mbere yo gukomeza, urebe ko umuhanda utekanye.", "Icyapa cya STOP gituma umugenzi amenya guhagarara ngo hamenyekane umutekano w'umuhanda." ), "Umuvuduko ntarengwa mu mujyi ni uwuhe?": ( "Ni 40 km/h mu mijyi.", "Umuvuduko ntarengwa ugamije kugabanya impanuka mu mijyi, cyane cyane hafi y'ahantu hateraniye abantu." ), "Icyapa cya Attention École gisobanura iki?": ( "Kigaragaza ko hafi yaho hari ishuri, ugomba kugabanya umuvuduko no kwitonda.", "Iki cyapa cyerekana ahari ishuri cyangwa abana bari hafi y'umuhanda." ), "Iyo umwana ari ku muhanda, ukora iki?": ( "Ugabanya umuvuduko kandi ube maso cyane.", "Umwana ashobora guhita yinjira mu muhanda nta kwitegereza, ugomba kwitonda cyane." ), "Iyo ugiye guca ku bandi, ukora iki?": ( "Ureba neza niba umuhanda ubibemerera kandi nta modoka iza imbere.", "Kureba mbere yo guca ku bandi birinda impanuka." ), } # ---------------- Functions ---------------- def gusubiza(ikibazo): ans, expl = ibisubizo_dict.get(ikibazo, ("Nta bisubizo bihari kuri icyo kibazo.", "Nta explanation.")) return ans + "\n\n💡 Explanation: " + expl def gutegura_quiz(batch_size=5): quiz = random.sample(list(ibisubizo_dict.items()), min(batch_size, len(ibisubizo_dict))) quiz_questions = [] quiz_choices = [] for q, (ans, _) in quiz: other_answers = list(set(a for a, _ in ibisubizo_dict.values()) - {ans}) choices = random.sample(other_answers, min(2, len(other_answers))) + [ans] random.shuffle(choices) quiz_questions.append(q) quiz_choices.append(choices) return quiz_questions, quiz_choices # ---------------- Timer Function ---------------- def start_timer(timer_box, duration=20): def countdown(): for i in range(duration, -1, -1): timer_box.update(value=f"⏱️ {i} seconds left", visible=True) time.sleep(1) thread = threading.Thread(target=countdown, daemon=True) thread.start() # ---------------- Gradio Interface ---------------- with gr.Blocks(theme=gr.themes.Soft(primary_hue="green", secondary_hue="yellow")) as demo: gr.Markdown("# 🚗 AI y’Amategeko y’Umuhanda 🇷🇼\n### *Yakozwe na Viateur Irasubiza*") # --- Igice cyo gusaba igisubizo --- with gr.Row(): with gr.Column(scale=1): ikibazo = gr.Dropdown(choices=list(ibisubizo_dict.keys()), label="➡️ Hitamo ikibazo", value=list(ibisubizo_dict.keys())[0]) kanda = gr.Button("🔍 Saba igisubizo") with gr.Column(scale=1): igisubizo = gr.Textbox(label="🧠 Igisubizo", lines=6) kanda.click(fn=gusubiza, inputs=ikibazo, outputs=igisubizo) # --- Quiz Section --- gr.Markdown("## 📝 Quiz: Amanota ako kanya ku kibazo kimwe ku gihe") quiz_button = gr.Button("Tangira Quiz") reset_button = gr.Button("🔄 Reset Quiz") quiz_score = gr.Textbox(label="🏆 Amanota yose", value="0/20", interactive=False) current_score = gr.State(0) quiz_questions_state = gr.State() quiz_choices_state = gr.State() current_question_state = gr.State("") radio_widgets = [] instant_outputs = [] timer_boxes = [] for i in range(5): r = gr.Radio(choices=[], label=f"Ikibazo {i+1}", visible=False) radio_widgets.append(r) inst = gr.Markdown("", visible=False) instant_outputs.append(inst) timer_box = gr.Markdown("", visible=False) timer_boxes.append(timer_box) # --- Start Quiz --- def start_quiz(): questions, choices = gutegura_quiz() updates = [] for i, r in enumerate(radio_widgets): if i < len(questions): updates.append(gr.update(choices=choices[i], label=questions[i], visible=True, value=None)) else: updates.append(gr.update(visible=False)) for inst in instant_outputs: updates.append(gr.update(value="", visible=False)) for timer_box in timer_boxes: updates.append(gr.update(value="", visible=False)) # Start timer for first question start_timer(timer_boxes[0]) return questions, choices, *updates, 0, "0/20", questions[0] quiz_button.click( fn=start_quiz, inputs=[], outputs=[quiz_questions_state, quiz_choices_state] + radio_widgets + instant_outputs + timer_boxes + [current_score, quiz_score, current_question_state] ) # --- Check Answer --- def check_answer(answer, question, score): if not question: return "", score, f"{score}/20" correct, expl = ibisubizo_dict.get(question, ("", "")) if answer == correct: score += 4 status = f"✅ Igisubizo cyawe ni cyo\n💡 Explanation: {expl}" else: status = f"❌ Igisubizo nyacyo: {correct}\n💡 Explanation: {expl}\nTip: Subira usome neza icyapa!" return status, score, f"{score}/20" for r, inst in zip(radio_widgets, instant_outputs): r.change(fn=check_answer, inputs=[r, current_question_state, current_score], outputs=[inst, current_score, quiz_score]) # --- Reset Quiz --- def reset_quiz(): updates = [] for r, inst, timer_box in zip(radio_widgets, instant_outputs, timer_boxes): updates.append(gr.update(visible=False, value=None)) updates.append(gr.update(value="")) updates.append(gr.update(value="", visible=False)) return 0, "0/20", *updates reset_button.click( fn=reset_quiz, inputs=[], outputs=[current_score, quiz_score] + radio_widgets + instant_outputs + timer_boxes ) # --- Footer / Copyright --- gr.Markdown("© 2025 Viateur Irasubiza. Uburenganzira bwose burabitswe.\n\nAI yakozwe kugirango ifashe Abanyarwanda kwiga amategeko y'umuhanda.") demo.launch()
e8c8729
verified