Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -615,86 +615,87 @@ def create_quiz_interface():
|
|
615 |
)
|
616 |
certificate_display = gr.Image(label="Your Certificate")
|
617 |
|
618 |
-
def on_generate_questions(text, num_questions):
|
619 |
-
success, questions = quiz_app.generate_questions(text, num_questions)
|
620 |
-
if not success:
|
621 |
-
return {
|
622 |
-
question_display: "",
|
623 |
-
current_options: gr.update(choices=[], visible=False),
|
624 |
-
question_counter: "",
|
625 |
-
question_box: gr.update(visible=False),
|
626 |
-
current_questions: [],
|
627 |
-
current_question_idx: 0,
|
628 |
-
answer_state: [None] * 5,
|
629 |
-
tabs: gr.update(selected=1),
|
630 |
-
results_group: gr.update(visible=False)
|
631 |
-
}
|
632 |
-
|
633 |
-
# Initialize first question
|
634 |
-
initial_answers = [None] * len(questions)
|
635 |
-
question = questions[0]
|
636 |
-
|
637 |
-
return {
|
638 |
-
question_display: f"""## Question 1
|
639 |
-
{question.question}
|
640 |
-
|
641 |
-
Please select one answer:""",
|
642 |
-
current_options: gr.update(
|
643 |
-
choices=question.options,
|
644 |
-
value=None,
|
645 |
-
visible=True,
|
646 |
-
label="Select your answer for Question 1:"
|
647 |
-
),
|
648 |
-
question_counter: f"Question 1 of {len(questions)}",
|
649 |
-
question_box: gr.update(visible=True),
|
650 |
-
current_questions: questions,
|
651 |
-
current_question_idx: 0,
|
652 |
-
answer_state: initial_answers,
|
653 |
-
tabs: gr.update(selected=1),
|
654 |
-
results_group: gr.update(visible=False)
|
655 |
-
}
|
656 |
-
|
657 |
-
def navigate(direction, current_idx, questions, answers, current_answer):
|
658 |
-
"""
|
659 |
-
Handle navigation between questions
|
660 |
-
"""
|
661 |
-
if not questions: # No questions available
|
662 |
-
return {
|
663 |
-
current_question_idx: 0,
|
664 |
-
answer_state: answers,
|
665 |
-
question_display: "",
|
666 |
-
current_options: gr.update(choices=[], value=None, visible=False),
|
667 |
-
question_counter: "",
|
668 |
-
question_box: gr.update(visible=False)
|
669 |
-
}
|
670 |
-
|
671 |
-
# Save current answer
|
672 |
-
new_answers = list(answers)
|
673 |
-
if current_answer and 0 <= current_idx < len(new_answers):
|
674 |
-
new_answers[current_idx] = current_answer
|
675 |
-
|
676 |
-
# Calculate new index
|
677 |
-
new_idx = max(0, min(len(questions) - 1, current_idx + direction))
|
678 |
-
|
679 |
-
# Get current question
|
680 |
-
question = questions[new_idx]
|
681 |
-
|
682 |
-
return {
|
683 |
-
current_question_idx: new_idx,
|
684 |
-
answer_state: new_answers,
|
685 |
-
question_display: f"""## Question {new_idx + 1}
|
686 |
-
{question.question}
|
687 |
|
688 |
-
|
689 |
-
|
690 |
-
|
691 |
-
|
692 |
-
|
693 |
-
|
694 |
-
|
695 |
-
|
696 |
-
|
697 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
698 |
|
699 |
def on_submit(questions, answers, current_idx, current_answer):
|
700 |
# Update the current answer in the answers list
|
@@ -753,25 +754,41 @@ Please select one answer:""",
|
|
753 |
generate_btn.click(
|
754 |
fn=on_generate_questions,
|
755 |
inputs=[text_input, num_questions],
|
756 |
-
outputs=
|
757 |
-
question_display
|
758 |
-
current_options
|
759 |
-
question_counter
|
760 |
-
question_box
|
761 |
-
current_questions
|
762 |
-
current_question_idx
|
763 |
-
answer_state
|
764 |
-
tabs
|
765 |
-
results_group
|
766 |
-
|
767 |
)
|
768 |
|
769 |
# Navigation event handlers
|
770 |
def handle_prev(current_idx, questions, answers, current_answer):
|
771 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
772 |
|
773 |
def handle_next(current_idx, questions, answers, current_answer):
|
774 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
775 |
|
776 |
prev_btn.click(
|
777 |
fn=handle_prev,
|
@@ -781,14 +798,14 @@ Please select one answer:""",
|
|
781 |
answer_state,
|
782 |
current_options
|
783 |
],
|
784 |
-
outputs=
|
785 |
-
current_question_idx
|
786 |
-
answer_state
|
787 |
-
question_display
|
788 |
-
current_options
|
789 |
-
question_counter
|
790 |
-
question_box
|
791 |
-
|
792 |
)
|
793 |
|
794 |
next_btn.click(
|
@@ -799,14 +816,14 @@ Please select one answer:""",
|
|
799 |
answer_state,
|
800 |
current_options
|
801 |
],
|
802 |
-
outputs=
|
803 |
-
current_question_idx
|
804 |
-
answer_state
|
805 |
-
question_display
|
806 |
-
current_options
|
807 |
-
question_counter
|
808 |
-
question_box
|
809 |
-
|
810 |
)
|
811 |
|
812 |
# Update answer state when radio button changes
|
@@ -823,22 +840,33 @@ Please select one answer:""",
|
|
823 |
)
|
824 |
|
825 |
# Submission handler
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
826 |
submit_btn.click(
|
827 |
-
fn=
|
828 |
inputs=[
|
829 |
current_questions,
|
830 |
answer_state,
|
831 |
current_question_idx,
|
832 |
current_options
|
833 |
],
|
834 |
-
outputs=
|
835 |
-
feedback_box
|
836 |
-
results_group
|
837 |
-
score_display
|
838 |
-
result_message
|
839 |
-
question_box
|
840 |
-
tabs
|
841 |
-
|
842 |
)
|
843 |
|
844 |
# Certificate generation
|
|
|
615 |
)
|
616 |
certificate_display = gr.Image(label="Your Certificate")
|
617 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
618 |
|
619 |
+
def on_generate_questions(text, num_questions):
|
620 |
+
success, questions = quiz_app.generate_questions(text, num_questions)
|
621 |
+
if not success:
|
622 |
+
return [
|
623 |
+
"", # question_display
|
624 |
+
gr.update(choices=[], visible=False), # current_options
|
625 |
+
"", # question_counter
|
626 |
+
gr.update(visible=False), # question_box
|
627 |
+
[], # current_questions
|
628 |
+
0, # current_question_idx
|
629 |
+
[None] * 5, # answer_state
|
630 |
+
gr.update(selected=1), # tabs
|
631 |
+
gr.update(visible=False) # results_group
|
632 |
+
]
|
633 |
+
|
634 |
+
# Initialize first question
|
635 |
+
initial_answers = [None] * len(questions)
|
636 |
+
question = questions[0]
|
637 |
+
|
638 |
+
return [
|
639 |
+
f"""## Question 1
|
640 |
+
{question.question}
|
641 |
+
|
642 |
+
Please select one answer:""", # question_display
|
643 |
+
gr.update(
|
644 |
+
choices=question.options,
|
645 |
+
value=None,
|
646 |
+
visible=True,
|
647 |
+
label="Select your answer for Question 1:"
|
648 |
+
), # current_options
|
649 |
+
f"Question 1 of {len(questions)}", # question_counter
|
650 |
+
gr.update(visible=True), # question_box
|
651 |
+
questions, # current_questions
|
652 |
+
0, # current_question_idx
|
653 |
+
initial_answers, # answer_state
|
654 |
+
gr.update(selected=1), # tabs
|
655 |
+
gr.update(visible=False) # results_group
|
656 |
+
]
|
657 |
+
|
658 |
+
def navigate(direction, current_idx, questions, answers, current_answer):
|
659 |
+
"""
|
660 |
+
Handle navigation between questions
|
661 |
+
"""
|
662 |
+
if not questions: # No questions available
|
663 |
+
return [
|
664 |
+
0, # current_question_idx
|
665 |
+
answers, # answer_state
|
666 |
+
"", # question_display
|
667 |
+
gr.update(choices=[], value=None, visible=False), # current_options
|
668 |
+
"", # question_counter
|
669 |
+
gr.update(visible=False) # question_box
|
670 |
+
]
|
671 |
+
|
672 |
+
# Save current answer
|
673 |
+
new_answers = list(answers)
|
674 |
+
if current_answer and 0 <= current_idx < len(new_answers):
|
675 |
+
new_answers[current_idx] = current_answer
|
676 |
+
|
677 |
+
# Calculate new index
|
678 |
+
new_idx = max(0, min(len(questions) - 1, current_idx + direction))
|
679 |
+
|
680 |
+
# Get current question
|
681 |
+
question = questions[new_idx]
|
682 |
+
|
683 |
+
return [
|
684 |
+
new_idx, # current_question_idx
|
685 |
+
new_answers, # answer_state
|
686 |
+
f"""## Question {new_idx + 1}
|
687 |
+
{question.question}
|
688 |
+
|
689 |
+
Please select one answer:""", # question_display
|
690 |
+
gr.update(
|
691 |
+
choices=question.options,
|
692 |
+
value=new_answers[new_idx] if new_idx < len(new_answers) else None,
|
693 |
+
visible=True,
|
694 |
+
label=f"Select your answer for Question {new_idx + 1}:"
|
695 |
+
), # current_options
|
696 |
+
f"Question {new_idx + 1} of {len(questions)}", # question_counter
|
697 |
+
gr.update(visible=True) # question_box
|
698 |
+
]
|
699 |
|
700 |
def on_submit(questions, answers, current_idx, current_answer):
|
701 |
# Update the current answer in the answers list
|
|
|
754 |
generate_btn.click(
|
755 |
fn=on_generate_questions,
|
756 |
inputs=[text_input, num_questions],
|
757 |
+
outputs=[
|
758 |
+
question_display,
|
759 |
+
current_options,
|
760 |
+
question_counter,
|
761 |
+
question_box,
|
762 |
+
current_questions,
|
763 |
+
current_question_idx,
|
764 |
+
answer_state,
|
765 |
+
tabs,
|
766 |
+
results_group
|
767 |
+
]
|
768 |
)
|
769 |
|
770 |
# Navigation event handlers
|
771 |
def handle_prev(current_idx, questions, answers, current_answer):
|
772 |
+
result = navigate(-1, current_idx, questions, answers, current_answer)
|
773 |
+
return [
|
774 |
+
result[current_question_idx],
|
775 |
+
result[answer_state],
|
776 |
+
result[question_display],
|
777 |
+
result[current_options],
|
778 |
+
result[question_counter],
|
779 |
+
result[question_box]
|
780 |
+
]
|
781 |
|
782 |
def handle_next(current_idx, questions, answers, current_answer):
|
783 |
+
result = navigate(1, current_idx, questions, answers, current_answer)
|
784 |
+
return [
|
785 |
+
result[current_question_idx],
|
786 |
+
result[answer_state],
|
787 |
+
result[question_display],
|
788 |
+
result[current_options],
|
789 |
+
result[question_counter],
|
790 |
+
result[question_box]
|
791 |
+
]
|
792 |
|
793 |
prev_btn.click(
|
794 |
fn=handle_prev,
|
|
|
798 |
answer_state,
|
799 |
current_options
|
800 |
],
|
801 |
+
outputs=[
|
802 |
+
current_question_idx,
|
803 |
+
answer_state,
|
804 |
+
question_display,
|
805 |
+
current_options,
|
806 |
+
question_counter,
|
807 |
+
question_box
|
808 |
+
]
|
809 |
)
|
810 |
|
811 |
next_btn.click(
|
|
|
816 |
answer_state,
|
817 |
current_options
|
818 |
],
|
819 |
+
outputs=[
|
820 |
+
current_question_idx,
|
821 |
+
answer_state,
|
822 |
+
question_display,
|
823 |
+
current_options,
|
824 |
+
question_counter,
|
825 |
+
question_box
|
826 |
+
]
|
827 |
)
|
828 |
|
829 |
# Update answer state when radio button changes
|
|
|
840 |
)
|
841 |
|
842 |
# Submission handler
|
843 |
+
def on_submit_wrapper(questions, answers, current_idx, current_answer):
|
844 |
+
result = on_submit(questions, answers, current_idx, current_answer)
|
845 |
+
return [
|
846 |
+
result[feedback_box],
|
847 |
+
result[results_group],
|
848 |
+
result[score_display],
|
849 |
+
result[result_message],
|
850 |
+
result[question_box],
|
851 |
+
result[tabs]
|
852 |
+
]
|
853 |
+
|
854 |
submit_btn.click(
|
855 |
+
fn=on_submit_wrapper,
|
856 |
inputs=[
|
857 |
current_questions,
|
858 |
answer_state,
|
859 |
current_question_idx,
|
860 |
current_options
|
861 |
],
|
862 |
+
outputs=[
|
863 |
+
feedback_box,
|
864 |
+
results_group,
|
865 |
+
score_display,
|
866 |
+
result_message,
|
867 |
+
question_box,
|
868 |
+
tabs
|
869 |
+
]
|
870 |
)
|
871 |
|
872 |
# Certificate generation
|