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