import streamlit as st import importlib import logging from fpdf import FPDF # Configure logging logging.basicConfig(level=logging.INFO) # List of available modules with shorter names and icons module_names = { "Bases": "presentation_bases", "Validity": "valid_invalid_numbers", "Conversion": "conversion_bases", "Grouping": "grouping_techniques", "Addition": "addition_bases", "2's Complement": "twos_complement", "Negative Numbers": "negative_binary", "Subtraction": "subtraction_bases", } # Initialize session state variables if 'questions' not in st.session_state: st.session_state.questions = [] if 'current_index' not in st.session_state: st.session_state.current_index = 0 if 'current_module' not in st.session_state: st.session_state.current_module = None if 'correct_count' not in st.session_state: st.session_state.correct_count = 0 if 'module_correct_count' not in st.session_state: st.session_state.module_correct_count = {name: 0 for name in module_names} if 'module_question_count' not in st.session_state: st.session_state.module_question_count = {name: 0 for name in module_names} def generate_pdf_report(): pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) pdf.cell(200, 10, txt="Quiz Report", ln=True, align="C") pdf.ln(10) for module in module_names.keys(): pdf.cell(200, 10, txt=f"Module: {module}", ln=True, align="L") pdf.ln(5) correct_count = st.session_state.module_correct_count[module] total_count = st.session_state.module_question_count[module] pdf.cell(200, 10, txt=f"Correct Answers: {correct_count}/{total_count}", ln=True, align="L") pdf.ln(5) for entry in st.session_state.questions: if entry['module'] == module: question, options, selected, correct, explanation = ( entry['question'], entry['options'], entry['selected'], entry['correct'], entry['explanation'] ) pdf.multi_cell(0, 10, f"Q: {question}") for option in options: if option == correct: pdf.multi_cell(0, 10, f"Correct: {option}") elif option == selected: pdf.multi_cell(0, 10, f"Your Choice: {option}") else: pdf.multi_cell(0, 10, f" {option}") pdf.multi_cell(0, 10, f"Explanation: {explanation}") pdf.ln(10) pdf.ln(10) # Add space after each module return pdf.output(dest='S').encode('latin1', 'replace') def load_module(module_name): module_file = module_names[module_name] module = importlib.import_module(f'modules.{module_file}') return module def generate_new_question(module_name): module = load_module(module_name) question, options, correct_answer, explanation = module.generate_question() return { 'module': module_name, 'question': question, 'options': options, 'correct': correct_answer, 'explanation': explanation, 'selected': None, 'answered': False } def navigate_question(direction): if direction == "prev" and st.session_state.current_index > 0: st.session_state.current_index -= 1 elif direction == "next": if st.session_state.current_index < len(st.session_state.questions) - 1: st.session_state.current_index += 1 else: # Generate a new question if at the end of the list new_question = generate_new_question(st.session_state.current_module) st.session_state.questions.append(new_question) st.session_state.current_index += 1 # Streamlit interface st.sidebar.title("Quiz Modules") module_name = st.sidebar.radio("Choose a module:", list(module_names.keys()), index=0) if module_name != st.session_state.current_module: st.session_state.current_module = module_name st.session_state.questions = [] st.session_state.current_index = 0 # Generate the first question for the new module st.session_state.questions.append(generate_new_question(module_name)) current_question = st.session_state.questions[st.session_state.current_index] # Button Row: Prev, Next, and PDF Download col1, col2, col3 = st.columns([1, 1, 2]) with col1: st.button("⬅️ Prev", disabled=st.session_state.current_index == 0, on_click=lambda: navigate_question("prev")) with col2: st.button("➡️ Next", on_click=lambda: navigate_question("next")) with col3: if st.session_state.current_index > 0: pdf = generate_pdf_report() st.download_button( label="Download PDF Report 📄", data=pdf, file_name="quiz_report.pdf", mime="application/pdf" ) # Display the current question st.write(f"**Question {st.session_state.current_index + 1}:** {current_question['question']}") if current_question['answered']: st.radio("Choose an answer:", current_question['options'], index=current_question['options'].index(current_question['selected'])) if current_question['selected'] == current_question['correct']: st.success(f"Correct! Your answer: {current_question['selected']}") else: st.error(f"Incorrect. Your answer: {current_question['selected']}") st.markdown( f"""
Explanation: {current_question['explanation']}
""", unsafe_allow_html=True ) else: selected_answer = st.radio("Choose an answer:", current_question['options'], key=st.session_state.current_index) if st.button("Submit"): if not current_question['answered']: current_question['selected'] = selected_answer current_question['answered'] = True st.session_state.module_question_count[module_name] += 1 if selected_answer == current_question['correct']: st.session_state.correct_count += 1 st.session_state.module_correct_count[module_name] += 1 st.experimental_rerun()