import altair as alt
import streamlit as st
import pandas as pd
import os
import zipfile
from PIL import Image
import sympy as sp
import time
import tempfile
# Page config
st.set_page_config(page_title="🎓 Smart Math Teacher", layout="centered")
# Custom CSS
st.markdown("""
""", unsafe_allow_html=True)
# Welcome title
st.markdown("
🧠✨ Welcome to the Smart Math Teacher! ✨🧠
", unsafe_allow_html=True)
# USER GUIDE - Always visible at the top
st.markdown("""
📖 How to Use This App:
**1. Select Your Age Group** - Choose your learning level (4-6, 7-9, or 13-15 years)
**2. Choose Math Category** - Pick what type of math to practice
**3. Solve Questions** - Read each question and type your answer
**4. Get Help** - Use hints or skip if needed
**5. Learn** - See correct answers and step-by-step solutions
""", unsafe_allow_html=True)
# Initialize session state for temp directory
if 'temp_dir' not in st.session_state:
st.session_state.temp_dir = tempfile.mkdtemp()
# Age group setup
age_groups = {
"4-6 Age Group": {"dataset": "src/Datase_of_4-6_Age_Group.xlsx", "zip_file": "src/Image_for_group_4-6.zip", "image_folder": "Image_for_group_4-6"},
"7-9 Age Group": {"dataset": "src/Datase_of_7-9_Age_Group.xlsx", "zip_file": "src/Image_for_group_7-9.zip", "image_folder": "Image_for_group_7-9"},
"13-15 Age Group": {"dataset": "src/Datase_of_13-15_Age_Group.xlsx", "zip_file": "src/Image_for_group_13-15.zip", "image_folder": "Image_for_group_13-15"},
}
selected_age_group = st.selectbox("🧒 Select your Age Group:", list(age_groups.keys()))
# Initialize session
if "session_initialized" not in st.session_state or st.session_state.age_group != selected_age_group:
st.session_state.age_group = selected_age_group
st.session_state.category = None
st.session_state.question_index = 0
st.session_state.show_answer = False
st.session_state.show_steps = False
st.session_state.session_initialized = True
# Load dataset
group_info = age_groups[selected_age_group]
dataset_path = group_info["dataset"]
zip_path = group_info["zip_file"]
image_folder = group_info["image_folder"]
# Create image folder in temp directory
temp_image_folder = os.path.join(st.session_state.temp_dir, image_folder)
os.makedirs(temp_image_folder, exist_ok=True)
# Extract images if zip exists
try:
if os.path.exists(zip_path):
with zipfile.ZipFile(zip_path, "r") as zip_ref:
zip_ref.extractall(temp_image_folder)
except Exception as e:
st.warning(f"Error extracting images: {e}")
if not os.path.exists(dataset_path):
st.error(f"Dataset not found: {dataset_path}")
st.stop()
try:
df = pd.read_excel(dataset_path)
df['category'] = df['category'].astype(str).str.strip()
except Exception as e:
st.error(f"Error loading dataset: {e}")
st.stop()
# Category selection
categories = sorted(df['category'].dropna().unique())
selected_category = st.selectbox("📚 Choose a Math Category:", options=categories)
# Update session if category changes
if st.session_state.category != selected_category:
st.session_state.category = selected_category
st.session_state.question_index = 0
st.session_state.show_answer = False
st.session_state.show_steps = False
st.rerun()
# Filter questions by selected category only
subset_df = df[df['category'] == selected_category].reset_index(drop=True)
if not subset_df.empty and st.session_state.question_index < len(subset_df):
question = subset_df.iloc[st.session_state.question_index]
progress = int((st.session_state.question_index / len(subset_df)) * 100)
st.progress(progress)
st.markdown(f"📘 Question {st.session_state.question_index + 1}:
{question['problem']}
", unsafe_allow_html=True)
# Display image with error handling
if pd.notna(question.get('image')):
image_name = str(question['image']).strip()
image_found = False
for root, _, files in os.walk(temp_image_folder):
for file in files:
if file.lower().startswith(image_name.lower()) or os.path.splitext(file)[0].lower() == image_name.lower():
try:
st.image(Image.open(os.path.join(root, file)), use_column_width=True)
image_found = True
break
except:
pass
if not image_found:
st.warning("❌ Image not found.")
user_ans = st.text_input("📝 Your Answer:", key=f"ans_{st.session_state.question_index}")
if st.button("✅ Submit Answer"):
if str(user_ans).strip().lower() == str(question['answer']).strip().lower():
st.success("🎉 Correct! Well done!")
st.balloons()
time.sleep(2)
st.session_state.question_index += 1
st.session_state.show_answer = False
st.session_state.show_steps = False
st.rerun()
else:
st.error("❌ Try again or view the correct answer below.")
st.session_state.show_answer = True
st.session_state.show_steps = False
if st.session_state.show_answer:
st.info(f"✅ Correct Answer: **{question['answer']}**")
if selected_age_group in ["7-9 Age Group", "13-15 Age Group"]:
if st.button("🔍 Show Steps"):
st.session_state.show_steps = True
if st.session_state.show_steps and pd.notna(question.get("steps", None)):
st.success(f"### 🪄 Steps:\n{question['steps']}")
if st.button("⏭️ Skip"):
st.session_state.question_index += 1
st.session_state.show_answer = False
st.session_state.show_steps = False
st.rerun()
elif subset_df.empty:
st.warning("⚠️ No questions available in this category. Try another one.")
else:
st.success("🏁 You've completed all questions in this category!")
# Cleanup function
def cleanup():
import shutil
if 'temp_dir' in st.session_state and os.path.exists(st.session_state.temp_dir):
shutil.rmtree(st.session_state.temp_dir)
import atexit
atexit.register(cleanup)