File size: 6,650 Bytes
7ba3b4e 795b9ba 764cfc6 bad6a07 d924141 764cfc6 795b9ba 2a56f14 7b17e7d e9df8e8 795b9ba 169cec0 054ca33 32f2e18 795b9ba 169cec0 795b9ba bad6a07 169cec0 e9df8e8 169cec0 32f2e18 8e6cd67 32f2e18 e9df8e8 795b9ba e9df8e8 ee53acf e9df8e8 169cec0 e9df8e8 7b6a611 e9df8e8 054ca33 e9df8e8 054ca33 e9df8e8 1d2d4c8 e9df8e8 054ca33 e9df8e8 169cec0 e9df8e8 a862f0d 169cec0 ee53acf 054ca33 |
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 |
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}
if 'selected_answer' not in st.session_state:
st.session_state.selected_answer = None
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))
# Load the current module for title and description
current_module = load_module(st.session_state.current_module)
current_question = st.session_state.questions[st.session_state.current_index]
# Display module title and description
st.title(current_module.title)
st.write(current_module.description)
# 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']), disabled=True)
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"""
<div style='border: 2px solid #ccc; padding: 15px;'>
<strong>Explanation:</strong> {current_question['explanation']}
</div>
""",
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 selected_answer:
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() # Trigger a rerun to display the result immediately
|