import random import gradio as gr from question_bank import question_bank def get_random_questions(n=50): return random.sample(question_bank, n) def grade_test(responses, name, roll_number, selected): score = 0 feedback = [] for idx, (resp, q) in enumerate(zip(responses, selected)): correct = q["answer"] if resp == q["options"][correct]: score += 1 feedback.append(f"Q{idx+1}: โœ… Correct") else: feedback.append(f"Q{idx+1}: โŒ Incorrect (Correct: {q['options'][correct]})") result = f""" **Name**: {name} **Roll Number**: {roll_number} **Score**: {score} / {len(selected)} **Percentage**: {round((score / len(selected)) * 100, 2)}% """ return result, "\n".join(feedback) def build_app(): with gr.Blocks() as demo: gr.Markdown("# ๐Ÿงช Preventive Maintenance Test") gr.Markdown("50 random questions selected from a large question bank.") with gr.Row(): name = gr.Textbox(label="Your Full Name") roll_number = gr.Textbox(label="Roll Number") selected_questions = get_random_questions() selected_state = gr.State(selected_questions) mcq_inputs = [] for q in selected_questions: mcq_inputs.append(gr.Radio(choices=q["options"], label=q["question"], interactive=True)) submit_btn = gr.Button("Submit Test") result_box = gr.Markdown() feedback_box = gr.Markdown() def on_submit(*args): answers = args[:-3] name = args[-3] roll_number = args[-2] selected = args[-1] return grade_test(answers, name, roll_number, selected) submit_btn.click( fn=on_submit, inputs=mcq_inputs + [name, roll_number, selected_state], outputs=[result_box, feedback_box] ) return demo demo = build_app() if __name__ == "__main__": demo.launch()