|
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) |
|
|
|
def show_questions(test_name): |
|
questions = data['tests'][test_name]['questions'] |
|
return {f"question{i+1}": gr.update(visible=True, label=question['text'], info=question['text']) for i, question in enumerate(questions)}, gr.update(visible=False) |
|
|
|
def check(answers, test_name): |
|
questions = data['tests'][test_name]['questions'] |
|
results = [] |
|
for answer, question in zip(answers, questions): |
|
if answer == question['correct_answer']: |
|
results.append("✔️") |
|
else: |
|
results.append(f"✖️ ({question['incorrect_text']})") |
|
return "\n".join(results), gr.update(visible=True) |
|
|
|
def reset(questions): |
|
return {f"question{i+1}": gr.update(visible=False) for i in range(len(questions))}, 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("Выбрать") |
|
questions = [gr.Radio(label="", choices=["А", "Б", "В"], visible=False) for _ in range(len(max(data['tests'].values(), key=lambda t: len(t['questions']))['questions']))] |
|
submit_button = gr.Button("Проверить", visible=False) |
|
back_button = gr.Button("Назад", visible=False) |
|
result_output = gr.Markdown(visible=False) |
|
|
|
select_button.click(show_questions, inputs=[test_selector], outputs=[questions, select_button]) |
|
submit_button.click(check, inputs=questions + [test_selector], outputs=[result_output, submit_button]) |
|
back_button.click(reset, inputs=[questions], outputs=[questions, test_selector]) |
|
|
|
vui.launch() |