File size: 7,812 Bytes
7ba3b4e 795b9ba 764cfc6 bad6a07 d924141 764cfc6 795b9ba 2a56f14 7b17e7d 795b9ba 97a8822 9124e0f 32f2e18 795b9ba d924141 795b9ba bad6a07 795b9ba 97a8822 795b9ba 97a8822 085d082 97a8822 085d082 97a8822 795b9ba 32f2e18 8e6cd67 32f2e18 764cfc6 929abf5 795b9ba 22745fe 764cfc6 22745fe 795b9ba 929abf5 795b9ba 32f2e18 27d1943 97a8822 795b9ba 97a8822 764cfc6 9124e0f 795b9ba bbafe5e b003425 7b6a611 a862f0d 22745fe a862f0d 085d082 a862f0d 085d082 a862f0d 764cfc6 929abf5 a862f0d bbafe5e a862f0d 9124e0f 27d1943 929abf5 795b9ba 764cfc6 929abf5 764cfc6 |
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 |
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 'correct_count' not in st.session_state:
st.session_state.correct_count = 0
if 'question_count' not in st.session_state:
st.session_state.question_count = 0
if 'current_module' not in st.session_state:
st.session_state.current_module = None
if 'question_queue' not in st.session_state:
st.session_state.question_queue = []
if 'submitted' not in st.session_state:
st.session_state.submitted = False
if 'current_question' not in st.session_state:
st.session_state.current_question = None
if 'options' not in st.session_state:
st.session_state.options = []
if 'correct_answer' not in st.session_state:
st.session_state.correct_answer = None
if 'explanation' not in st.session_state:
st.session_state.explanation = None
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 idx, entry in enumerate(st.session_state.question_queue):
question, options, selected, correct, explanation = entry
pdf.multi_cell(0, 10, f"Q{idx+1}: {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)
return pdf.output(dest='S').encode('latin1', 'replace')
# Logging for debugging
logging.info(f"Current Module: {st.session_state.current_module}")
logging.info(f"Question Count: {st.session_state.question_count}")
logging.info(f"Correct Count: {st.session_state.correct_count}")
logging.info(f"Submitted: {st.session_state.submitted}")
logging.info(f"Current Question: {st.session_state.current_question}")
logging.info(f"Options: {st.session_state.options}")
logging.info(f"Selected Answer: {st.session_state.selected_answer}")
logging.info(f"Correct Answer: {st.session_state.correct_answer}")
logging.info(f"Explanation: {st.session_state.explanation}")
# Streamlit interface
st.sidebar.title("Quiz Modules")
module_name = st.sidebar.radio("Choose a module:", list(module_names.keys()), index=0)
if module_name:
if st.session_state.current_module != module_name:
st.session_state.current_module = module_name
st.session_state.question_count = 0
st.session_state.correct_count = 0
st.session_state.question_queue = []
st.session_state.current_question = None
st.session_state.submitted = False
logging.info("Module changed. Resetting session state.")
module_file = module_names[module_name]
try:
module = importlib.import_module(f'modules.{module_file}')
generate_question = module.generate_question
title = getattr(module, 'title', f"{module_name} Module")
description = getattr(module, 'description', "Description is not available")
# Show module title and description
st.title(title)
st.write(description)
# Handle question generation and submission
if st.session_state.current_question is None or st.session_state.submitted:
st.session_state.current_question, st.session_state.options, st.session_state.correct_answer, st.session_state.explanation = generate_question()
st.session_state.submitted = False
st.session_state.selected_answer = None
logging.info("Generated new question.")
if st.session_state.question_count > 0:
correct_percentage = (st.session_state.correct_count / st.session_state.question_count) * 100
st.write(f"**Correct Answers:** {st.session_state.correct_count}/{st.session_state.question_count} ({correct_percentage:.2f}%)")
st.write(f"**Question {st.session_state.question_count + 1}:** {st.session_state.current_question}")
st.session_state.selected_answer = st.radio("Choose an answer:", st.session_state.options, key=st.session_state.question_count)
if st.button("Submit"):
st.session_state.submitted = True
st.session_state.question_count += 1
st.session_state.question_queue.append((
st.session_state.current_question,
st.session_state.options,
st.session_state.selected_answer,
st.session_state.correct_answer,
st.session_state.explanation
))
if st.session_state.selected_answer == st.session_state.correct_answer:
st.session_state.correct_count += 1
st.success("Correct!")
else:
st.error("Incorrect.")
logging.info("Answer submitted.")
logging.info(f"Selected Answer: {st.session_state.selected_answer}")
logging.info(f"Correct Answer: {st.session_state.correct_answer}")
# Explanation with proper width
st.markdown(
f"""
<div style='border: 2px solid #ccc; padding: 15px;'>
<strong>Explanation:</strong> {st.session_state.explanation}
</div>
""",
unsafe_allow_html=True
)
# Display the "Next", "Prev", and "Download PDF Report" buttons above the question
col1, col2, col3 = st.columns([1, 1, 2])
with col1:
if st.session_state.submitted:
if st.button("➡️ Next"):
st.session_state.current_question = None
logging.info("Navigated to next question.")
with col2:
if st.session_state.question_count > 1:
if st.button("⬅️ Prev"):
st.session_state.question_count -= 1
st.session_state.submitted = False
question_data = st.session_state.question_queue[st.session_state.question_count - 1]
st.session_state.current_question = question_data[0]
st.session_state.options = question_data[1]
st.session_state.selected_answer = question_data[2]
st.session_state.correct_answer = question_data[3]
st.session_state.explanation = question_data[4]
logging.info("Navigated to previous question.")
with col3:
if st.session_state.question_count > 0:
pdf = generate_pdf_report()
st.download_button(
label="Download PDF Report 📄",
data=pdf,
file_name="quiz_report.pdf",
mime="application/pdf"
)
logging.info("PDF report generated.")
except ModuleNotFoundError as e:
st.error(f"The module '{module_name}' was not found. Please select another module.")
logging.error(f"Error: {e}")
except Exception as e:
st.error(f"An unexpected error occurred: {str(e)}")
logging.error(f"Error: {str(e)}")
|