Test1 / app.py
Rooni's picture
Update app.py
2c06f05
raw
history blame
No virus
3.57 kB
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()