flash_cards / app.py
JustusI's picture
Update app.py
8b87e6e verified
import streamlit as st
import tempfile
import json
import random
from crewai_flashcard import generate_flashcards
# --- Set up the Streamlit app ---
st.title("Study Companion: Flashcard Generator")
# Create two tabs: one to generate flashcards from a PDF, and one to practice them.
#tab_gen = st.tabs(["Generate Flashcards"])
#tab_gen, tab_practice = st.tabs(["Generate Flashcards", "Practice Flashcards"])
# Initialize session state for flashcards and flashcard practice
if "flashcards" not in st.session_state:
st.session_state.flashcards = [] # List of generated flashcards (JSON objects)
if "current_card" not in st.session_state:
st.session_state.current_card = 0
if "score" not in st.session_state:
st.session_state.score = 0
if "show_answer" not in st.session_state:
st.session_state.show_answer = False
# --- Tab 1: Generate Flashcards from PDF ---
#with tab_gen:
st.header("Generate Flashcards from PDF")
uploaded_file = st.file_uploader("Upload PDF file", type="pdf")
#page_range = st.text_input("Enter page range to extract (e.g., '1-5' or '1'):")
flashcard_count = st.number_input("Number of flashcards to generate:", min_value=1, max_value=5, value=3, step=1)
if uploaded_file is not None:# and page_range:
# Save the uploaded file to a temporary location
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp:
tmp.write(uploaded_file.read())
pdf_file_path = tmp.name
st.success("PDF uploaded successfully!")
if st.button("Generate Flashcards"):
with st.spinner("Generating flashcards..."):
# This function runs the CrewAI system and writes flashcards to JSON output
flashcards_json = generate_flashcards(pdf_file_path, flashcard_count)#generate_flashcards(pdf_file_path, page_range, flashcard_count)
#st.markdown(flashcards_json)
try:
# Parse the JSON output and save it in session state
st.session_state.flashcards = json.loads(flashcards_json)
st.success("Flashcards generated successfully!")
# Reset practice state
st.session_state.current_card = 0
st.session_state.score = 0
st.session_state.show_answer = False
except Exception as e:
st.error(f"Error parsing flashcards: {e}")
# --- Tab 2: Practice Flashcards ---
#with tab_practice:
st.header("Practice Flashcards")
if st.session_state.flashcards:
total_cards = len(st.session_state.flashcards)
# Check if we've completed all flashcards
if st.session_state.current_card >= total_cards:
st.success(f"You've completed all flashcards! Final Score: {st.session_state.score} / {total_cards}")
st.info("Restart the practice session or generate new flashcards.")
else:
# Safe access: ensure current_card is valid
current_card = st.session_state.flashcards[st.session_state.current_card]
st.write(f"**Question:** {current_card.get('question', 'No question provided')}")
# Answer reveal button
if st.button("Show Answer"):
st.session_state.show_answer = True
# If answer is revealed, show it and provide feedback options
if st.session_state.show_answer:
st.write(f"**Answer:** {current_card.get('answer', 'No answer provided')}")
col1, col2 = st.columns(2)
with col1:
if st.button("Correct"):
st.session_state.score += 1
st.success("Correct!")
with col2:
if st.button("Wrong"):
st.error("Incorrect!")
if st.button("Next Card"):
st.session_state.current_card += 1
st.session_state.show_answer = False
st.rerun()
st.write(f"**Current Score:** {st.session_state.score}/{total_cards}")
else:
st.info("No flashcards available. Please generate flashcards first.")
# # --- Tab 2: Practice Flashcards ---
# with tab_practice:
# st.header("Practice Flashcards")
# if st.session_state.flashcards:
# # Optionally, randomize flashcard order on first run
# if "shuffled" not in st.session_state:
# random.shuffle(st.session_state.flashcards)
# st.session_state.shuffled = True
# current_card = st.session_state.flashcards[st.session_state.current_card]
# st.write(f"**Question:** {current_card.get('question', 'No question provided')}")
# # Button to reveal the answer
# if st.button("Show Answer"):
# st.session_state.show_answer = True
# # If answer is revealed, show answer and feedback options
# if st.session_state.show_answer:
# st.write(f"**Answer:** {current_card.get('answer', 'No answer provided')}")
# col1, col2 = st.columns(2)
# with col1:
# if st.button("Correct"):
# st.session_state.score += 1
# st.success("Correct!")
# with col2:
# if st.button("Wrong"):
# st.error("Incorrect!")
# # Navigation: if this is the last card, show final score; otherwise, go to next card.
# if st.button("Next Card"):
# st.session_state.current_card += 1
# st.session_state.show_answer = False
# #st.experimental_rerun()
# st.write(f"**Current Score:** {st.session_state.score}/{len(st.session_state.flashcards)}")
# else:
# st.info("No flashcards available. Please generate flashcards first.")
# # if st.button("Next Card"):
# # st.session_state.current_card = (st.session_state.current_card + 1) % len(st.session_state.flashcards)
# # st.session_state.show_answer = False
# # st.experimental_rerun()
# # st.write(f"**Current Score:** {st.session_state.score}/{len(st.session_state.flashcards)}")
# # else:
# # st.info("No flashcards available. Please generate flashcards first.")