import gradio as gr import json json_data = """ { "tests": { "test1": { "questions": [ {"text": "Выберите А", "correct_answer": "А", "incorrect_text": "Правильный ответ - А."}, {"text": "Выберите Б", "correct_answer": "Б", "incorrect_text": "Правильный ответ - Б."} ] }, "test2": { "questions": [ {"text": "Выберите В", "correct_answer": "В", "incorrect_text": "Правильный ответ - В."}, {"text": "Выберите А", "correct_answer": "А", "incorrect_text": "Правильный ответ - А."} ] } } } """ data = json.loads(json_data) # Получаем максимальное количество вопросов в тестах для создания радио кнопок max_questions = max(len(test['questions']) for test in data['tests'].values()) def show_questions(test_name): questions = data['tests'][test_name]['questions'] correct_answers = [q['correct_answer'] for q in questions] incorrect_texts = [q['incorrect_text'] for q in questions] # Возвращаем состояния видимости и текст вопросов для радио кнопок outputs = [gr.update(visible=True, label=q['text']) for q in questions] + \ [gr.update(visible=False)] * (max_questions - len(questions)) # Возвращаем состояния видимости для кнопок и результатов return outputs, gr.update(visible=True), gr.update(visible=False), correct_answers, incorrect_texts def check(answers, correct_answers, incorrect_texts): results = [] for answer, correct, incorrect in zip(answers, correct_answers, incorrect_texts): results.append("✔️" if answer == correct else f"✖️ {incorrect}") return "\n".join(results), gr.update(visible=True) def reset(): # Сброс всех радио кнопок и скрытие кнопок и результатов return [gr.update(visible=False, value='') for _ in range(max_questions)], gr.update(visible=False), gr.update(visible=True) css = """ footer {visibility: hidden !important;} """ with gr.Blocks(css=css, theme='YTheme/TehnoX') as vui: with gr.Row(): test_selector = gr.Radio(label="Выберите тест", choices=list(data['tests'].keys())) select_button = gr.Button("Выбрать") with gr.Row(): question_blocks = [gr.Radio(choices=["А", "Б", "В"], visible=False) for _ in range(max_questions)] submit_button = gr.Button("Проверить", visible=False) back_button = gr.Button("Назад", visible=False) result_output = gr.Markdown(visible=False) # Сохраняем правильные ответы и тексты ошибок в замыканиях correct_answers = [] incorrect_texts = [] def show_questions_closure(test_name): return show_questions(test_name) def check_closure(answers): return check(answers, correct_answers, incorrect_texts) select_button.click(fn=show_questions_closure, inputs=[test_selector], outputs=question_blocks + [submit_button, back_button]) submit_button.click(fn=check_closure, inputs=question_blocks, outputs=[result_output]) back_button.click(fn=reset, inputs=[], outputs=question_blocks + [result_output, submit_button, test_selector]) vui.launch()