File size: 9,123 Bytes
8f11219
7340672
8f11219
 
 
 
7340672
 
9c81979
 
7340672
 
9c81979
7340672
 
 
 
8f11219
7340672
9708d0e
8f11219
7340672
9708d0e
6493548
8f11219
9708d0e
7340672
9708d0e
7340672
 
9708d0e
7340672
 
9708d0e
 
8f11219
7340672
9708d0e
8f11219
7340672
 
 
6493548
8f11219
9708d0e
7340672
 
 
 
 
 
 
 
 
 
 
 
9708d0e
7340672
 
9708d0e
 
 
 
 
8f11219
7340672
8f11219
 
9708d0e
7340672
 
 
 
 
 
 
 
9708d0e
7340672
 
 
9708d0e
8f11219
7340672
9708d0e
8f11219
7340672
9708d0e
8f11219
7340672
9708d0e
8f11219
7340672
9708d0e
 
7340672
9708d0e
7340672
9708d0e
7340672
 
9708d0e
7340672
 
9708d0e
 
 
 
8f11219
 
10152dd
8f11219
9708d0e
 
7340672
9708d0e
7340672
9708d0e
 
 
7340672
9708d0e
 
 
 
7340672
8f11219
10152dd
 
9708d0e
 
 
 
 
 
8f11219
9708d0e
 
 
 
 
8f11219
9708d0e
 
 
7340672
9708d0e
 
 
 
 
7340672
9708d0e
 
7340672
9708d0e
 
 
8f11219
9708d0e
 
8f11219
9708d0e
7340672
 
9708d0e
 
7340672
9708d0e
7340672
 
 
 
 
 
9708d0e
 
8f11219
9708d0e
7340672
9708d0e
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
'''
AWS Exam Simulator v.05
Program Developed by Ruslan Magana Vsevolovna
The purpose of this program is help to practice the questions of AWS Exams.
'''
import gradio as gr
from tool import *  # Assuming this module contains your exam data and text-to-speech functionality
from backend1 import *


# Global variable to store the currently selected set of exam questions
selected_questions = []

description_str = """Developed by Ruslan Magana, this interactive quiz platform is designed to help you prepare and assess your knowledge in a variety of exams. 
For more information about the developer, please visit [ruslanmv.com](https://ruslanmv.com/).
**Get Started with Your Quiz** 
Select an exam from the dropdown menu below and start testing your skills. You can also choose to enable audio feedback to enhance your learning experience. Simply toggle the "Enable Audio" checkbox to turn it on or off."""

# --- FUNCTION DEFINITIONS ---

def start_exam(exam_choice, audio_enabled):
    """Starts the exam by selecting questions, setting up UI."""
    global selected_questions
    selected_questions = select_exam_vce(exam_choice)
    question, options, audio_path = display_question(0, audio_enabled)
    return (
        # Hide start screen elements
        gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False),
        gr.update(visible=False), # Hide the audio_checkbox
        # Show quiz elements
        gr.update(visible=True), question, gr.update(choices=options, visible=True), gr.update(visible=True),
        gr.update(visible=True), gr.update(visible=True), gr.update(visible=True), 0, "", audio_path, gr.update(visible=True),
        gr.update(visible=True), None  # None for the audio stop signal
    )

def display_question(index, audio_enabled):
    """Displays a question with options and generates audio (if enabled)."""
    if index < 0 or index >= len(selected_questions):
        return "No more questions.", [], None
    question_text_ = selected_questions[index].get('question', 'No question text available.')
    question_text = f"**Question {index + 1}:** {question_text_}"
    choices_options = selected_questions[index].get('options', [])
    audio_path = text_to_speech(question_text_ + " " + " ".join(choices_options)) if audio_enabled else None
    return question_text, choices_options, audio_path

def show_explanation(index):
    """Shows the explanation for the current question and hides previous results."""
    if 0 <= index < len(selected_questions):
        explanation = selected_questions[index].get('explanation', 'No explanation available for this question.')
        return (
            f"**Explanation:** {explanation}", 
            gr.update(visible=True),  # Show explanation_text
            gr.update(visible=True)   # Show result_text
        )
    else:
        return "No explanation available for this question.", gr.update(visible=False), gr.update(visible=False)

def check_answer(index, answer):
    """Checks the given answer against the correct answer."""
    correct_answer = selected_questions[index].get('correct', 'No correct answer provided.')
    if answer == correct_answer:
        return f"Correct! The answer is: {correct_answer}"
    else:
        return f"Incorrect. The correct answer is: {correct_answer}"

def update_question(index, audio_enabled):
    """Updates the displayed question when the index changes."""
    question, options, audio_path = display_question(index, audio_enabled)
    return question, gr.update(choices=options), index, audio_path

def handle_answer(index, answer, audio_enabled, current_audio):
    """Handles answer submission, provides feedback, and generates audio."""
    # Handle the case when no answer is selected
    if answer is None:
        return "Please select an option before submitting.", None, None
    
    # Stop the current question audio before playing the answer audio
    stop_audio = True if current_audio else False
    result = check_answer(index, answer)
    answer_audio_path = text_to_speech(result) if audio_enabled else None
    return result, answer_audio_path, stop_audio


def handle_next(index, audio_enabled):
    """Moves to the next question and updates the UI."""
    new_index = min(index + 1, len(selected_questions) - 1)
    question, options, new_index, audio_path = update_question(new_index, audio_enabled)
    return question, options, new_index, "", audio_path, gr.update(visible=False)  # Hide explanation

def handle_previous(index, audio_enabled):
    """Moves to the previous question and updates the UI."""
    new_index = max(index - 1, 0)
    question, options, new_index, audio_path = update_question(new_index, audio_enabled)
    return question, options, new_index, "", audio_path, gr.update(visible=False)  # Hide explanation

def return_home():
    """Returns to the home screen."""
    return (
        # Show start screen elements
        gr.update(visible=True), gr.update(visible=True), gr.update(visible=True), gr.update(visible=True),
        gr.update(visible=True), # Show the audio_checkbox
        # Hide quiz elements
        gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False),
        gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), "", "", gr.update(visible=False), gr.update(visible=False),
        gr.update(visible=False)  # Hide explain button
    )

with gr.Blocks() as demo:
    # Home page elements
    title = gr.Markdown(value="**AWS Exam Simulator (Quiz)**")
    description = gr.Markdown(value=description_str)
    exam_selector = gr.Dropdown(label="Select an exam", choices=exams, value='CLF-C02-v1')
    audio_checkbox = gr.Checkbox(label="Enable Audio", value=True)
    start_button = gr.Button("Start Exam")

    # Quiz elements (initially hidden)
    question_state = gr.State(0)
    current_audio_state = gr.State(None)  # State to track the current audio playing
    question_text = gr.Markdown(visible=False, elem_id="question-text")
    choices = gr.Radio(visible=False, label="Options")
    result_text = gr.Markdown(visible=True)
    explanation_text = gr.Markdown(visible=False)
    answer_button = gr.Button("Submit Answer", visible=False)
    next_button = gr.Button("Next Question", visible=False)
    prev_button = gr.Button("Previous Question", visible=False)
    home_button = gr.Button("Return to Home", visible=False)
    explain_button = gr.Button("Explain", visible=False)
    question_audio = gr.Audio(visible=False, label="Question Audio", autoplay=True)
    answer_audio = gr.Audio(visible=False, label="Answer Audio", autoplay=True)

    # Layout for the home page
    with gr.Row():
        gr.Column([title])
    with gr.Row():
        gr.Column([description])
    with gr.Row():
        gr.Column([exam_selector, audio_checkbox])
    with gr.Row():
        gr.Column([start_button])

    # Layout for the quiz
    with gr.Row():
        gr.Column([question_text, question_audio])
    with gr.Row():
        gr.Column([choices])
    with gr.Row():
        gr.Column([result_text, explanation_text, answer_audio])
    with gr.Row():
        gr.Column([prev_button], scale=1)
        gr.Column([], scale=8)
        gr.Column([next_button], scale=1)
    with gr.Row():
        gr.Column([answer_button, explain_button])
    with gr.Row():
        gr.Column([home_button])
    
    # Connect the start button to start the exam
    start_button.click(
        fn=start_exam, 
        inputs=[exam_selector, audio_checkbox], 
        outputs=[
            title, description, exam_selector, start_button,
            audio_checkbox,  # Ensure the checkbox visibility is updated
            question_text, question_text, choices, answer_button, 
            next_button, prev_button, home_button, question_state, result_text, question_audio,
            explain_button, current_audio_state  # Add current_audio_state to the outputs
        ]
    )
    
    # Connect the quiz buttons to their functions
    answer_button.click(fn=handle_answer, inputs=[question_state, choices, audio_checkbox, current_audio_state], outputs=[result_text, answer_audio, current_audio_state])
    next_button.click(fn=handle_next, inputs=[question_state, audio_checkbox], outputs=[question_text, choices, question_state, result_text, question_audio, explanation_text])
    prev_button.click(fn=handle_previous, inputs=[question_state, audio_checkbox], outputs=[question_text, choices, question_state, result_text, question_audio, explanation_text])

    explain_button.click(fn=show_explanation, inputs=[question_state], outputs=[explanation_text, result_text, explanation_text])  # Output to both to toggle visibility

    home_button.click(fn=return_home, inputs=None, outputs=[
        title, description, exam_selector, start_button,
        audio_checkbox,  # Ensure the checkbox visibility is updated
        question_text, question_text, choices, answer_button, 
        next_button, prev_button, home_button, question_state, result_text, explanation_text, explain_button
    ])

demo.launch()