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
| 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() | |