Spaces:
Runtime error
Runtime error
| import pandas as pd | |
| import random | |
| import gradio as gr | |
| import asyncio | |
| # Load the CSV data asynchronously | |
| async def load_data(): | |
| url = "IPA.csv" | |
| try: | |
| data = await asyncio.to_thread(pd.read_csv, url, encoding='utf-8') | |
| if 'IPA' not in data.columns: | |
| raise ValueError("The required 'IPA' column is missing in the data.") | |
| return data | |
| except Exception as e: | |
| raise ValueError(f"Error loading data: {e}") | |
| # Initial empty dataframe | |
| df = pd.DataFrame() | |
| # Properties to ask about for each IPA symbol | |
| properties = ['Voicing', 'Place', 'Centrality', 'Oro-nasal', 'Manner'] | |
| # Generate a new question | |
| def generate_question(used_ipa_symbols): | |
| if df.empty or 'IPA' not in df.columns: | |
| raise ValueError("IPA data is not loaded properly or missing.") | |
| # Loop until we get a valid IPA symbol that hasn't been used yet | |
| while True: | |
| current_ipa = df.sample(1).iloc[0] | |
| if not pd.isnull(current_ipa['IPA']) and current_ipa['IPA'] not in used_ipa_symbols: | |
| available_properties = [prop for prop in properties if not pd.isnull(current_ipa[prop])] | |
| if available_properties: | |
| break | |
| used_ipa_symbols.append(current_ipa['IPA']) | |
| property_name = random.choice(available_properties) | |
| question = f"IPA Symbol: {current_ipa['IPA']}\nWhat is the {property_name.lower()} of this IPA symbol?" | |
| answer = current_ipa[property_name].lower() | |
| return question, answer, used_ipa_symbols | |
| # Check the answer and update the score and trials | |
| def quiz_function(user_answer, correct_answer, score, trials): | |
| if user_answer.lower() == correct_answer: | |
| score += 1 | |
| result = f"Correct! The answer was '{correct_answer}'." | |
| else: | |
| result = f"Wrong! The correct answer was '{correct_answer}'." | |
| trials += 1 | |
| return result, score, trials | |
| # Initialize a dictionary to store session-specific data | |
| user_sessions = {} | |
| # Define the Gradio interface | |
| def gradio_interface(): | |
| with gr.Blocks(css=""" | |
| #start_button, #submit_button, #quit_button { | |
| width: 200px; | |
| height: 50px; | |
| font-size: 16px; | |
| color: black; | |
| background-color: #f0f0f0; | |
| text-align: center; | |
| padding: 0; | |
| display: inline-block; | |
| font-family: Arial, sans-serif; | |
| vertical-align: middle; | |
| line-height: 50px; | |
| } | |
| """) as app: | |
| # Define the components with `elem_id` to apply custom CSS | |
| name_input = gr.Textbox(label="Enter your name", placeholder="Your name") | |
| start_button = gr.Button("Start Quiz", elem_id="start_button") | |
| question_label = gr.Textbox(label="Question", interactive=False) | |
| answer_input = gr.Textbox(label="Your Answer", placeholder="Type your answer here") | |
| submit_button = gr.Button("Submit", elem_id="submit_button") | |
| output_label = gr.Textbox(label="Result", interactive=False) | |
| quit_button = gr.Button("Quit", elem_id="quit_button") | |
| score_state = gr.State(0) | |
| trials_state = gr.State(0) | |
| used_ipa_symbols_state = gr.State([]) | |
| current_answer_state = gr.State("") | |
| # Start quiz function with async loading | |
| async def start_quiz(name): | |
| global df | |
| if not name: | |
| yield gr.update(), gr.update(value="Please enter your name to start the quiz."), "", "", gr.update() | |
| if df.empty: | |
| # Display loading message | |
| yield gr.update(), gr.update(value="Loading data... Please wait."), "", "", gr.update() | |
| # Asynchronously load data | |
| try: | |
| df = await load_data() | |
| yield gr.update(), gr.update(value="Data loaded. Starting the quiz."), "", "", gr.update() | |
| except Exception as e: | |
| yield gr.update(), gr.update(value=f"Failed to load data: {e}"), "", "", gr.update() | |
| return # Exit the function if data fails to load | |
| # Initialize user session for the current user | |
| if name not in user_sessions: | |
| user_sessions[name] = { | |
| "score": 0, | |
| "trials": 0, | |
| "used_ipa_symbols": [], | |
| "current_answer": "" | |
| } | |
| session = user_sessions[name] | |
| # Generate first question | |
| question, answer, used_ipa_symbols = generate_question(session["used_ipa_symbols"]) | |
| session["current_answer"] = answer | |
| session["used_ipa_symbols"] = used_ipa_symbols | |
| yield gr.update(value=question), "", "", gr.update(value="Submit"), gr.update() | |
| # Submit answer function | |
| def submit_answer(name, user_answer): | |
| if name not in user_sessions: | |
| return gr.update(), gr.update(value="Please start the quiz first."), "", "", gr.update() | |
| session = user_sessions[name] | |
| # Check the answer | |
| result, score, trials = quiz_function(user_answer, session["current_answer"], session["score"], session["trials"]) | |
| session["score"] = score | |
| session["trials"] = trials | |
| # Generate next question | |
| question, answer, used_ipa_symbols = generate_question(session["used_ipa_symbols"]) | |
| session["current_answer"] = answer | |
| session["used_ipa_symbols"] = used_ipa_symbols | |
| return gr.update(value=question), "", gr.update(value=result), gr.update(value="Submit"), gr.update() | |
| # Quit quiz function | |
| def quit_quiz(name): | |
| if name not in user_sessions: | |
| return gr.update(value="You haven't started the quiz yet."), gr.update() | |
| session = user_sessions.pop(name) | |
| return gr.update(value=f"Quiz ended. Well done, {name}! Your total score: {session['score']}/{session['trials']} points."), gr.update() | |
| # Bind functions to buttons | |
| start_button.click( | |
| fn=start_quiz, | |
| inputs=[name_input], | |
| outputs=[question_label, answer_input, output_label, submit_button, quit_button] | |
| ) | |
| submit_button.click( | |
| fn=submit_answer, | |
| inputs=[name_input, answer_input], | |
| outputs=[question_label, answer_input, output_label, submit_button, quit_button] | |
| ) | |
| quit_button.click( | |
| fn=quit_quiz, | |
| inputs=[name_input], | |
| outputs=[output_label, quit_button] | |
| ) | |
| return app | |
| app = gradio_interface() | |
| app.launch() | |