tonyhui2234's picture
Update app.py
8d42e5f verified
raw
history blame
6.86 kB
import streamlit as st
import random
import pandas as pd
import requests
from io import BytesIO
from PIL import Image
# Define maximum dimensions for the fortune image (in pixels)
MAX_SIZE = (400, 400)
# Set page configuration
st.set_page_config(page_title="Fortuen Stick Enquiry", layout="wide")
st.title("Fortuen Stick Enquiry")
# Initialize session state variables
if "submitted_text" not in st.session_state:
st.session_state.submitted_text = False
if "fortune_number" not in st.session_state:
st.session_state.fortune_number = None
if "fortune_row" not in st.session_state:
st.session_state.fortune_row = None
if "fortune_data" not in st.session_state:
try:
st.session_state.fortune_data = pd.read_csv("detail.csv")
except Exception as e:
st.error(f"Error loading CSV: {e}")
st.session_state.fortune_data = None
if "stick_clicked" not in st.session_state:
st.session_state.stick_clicked = False
# Callback function for the submit button:
def submit_text_callback():
st.session_state.submitted_text = True
# Randomly generate a number from 1 to 100
st.session_state.fortune_number = random.randint(1, 100)
# Look up the row in the CSV where CNumber matches the generated fortune number.
df = st.session_state.fortune_data
if df is not None:
matching_row = df[df['CNumber'] == st.session_state.fortune_number]
if not matching_row.empty:
row = matching_row.iloc[0]
st.session_state.fortune_row = {
"Header": row.get("Header", "N/A"),
"Luck": row.get("Luck", "N/A"),
"Description": row.get("Description", "No description available."),
"Detail": row.get("Detail", "No detail available."),
"HeaderLink": row.get("link", None) # URL to the image
}
else:
st.session_state.fortune_row = {
"Header": "N/A",
"Luck": "N/A",
"Description": "No description available.",
"Detail": "No detail available.",
"HeaderLink": None
}
# Function to load and resize local images using Pillow
def load_and_resize_image(path, max_size=MAX_SIZE):
try:
img = Image.open(path)
img.thumbnail(max_size, Image.Resampling.LANCZOS)
return img
except Exception as e:
st.error(f"Error loading image: {e}")
return None
# Function to download image from URL and resize it
def download_and_resize_image(url, max_size=MAX_SIZE):
try:
response = requests.get(url)
response.raise_for_status()
image_bytes = BytesIO(response.content)
img = Image.open(image_bytes)
img.thumbnail(max_size, Image.Resampling.LANCZOS)
return img
except Exception as e:
st.error(f"Error loading image from URL: {e}")
return None
def stick_enquiry_callback():
st.session_state.stick_clicked = True
# Main layout: Left (input) and Right (fortune display)
left_col, _, right_col = st.columns([3, 1, 5])
# # ---- Left Column ----
# with left_col:
# left_top = st.container()
# left_bottom = st.container()
# # Top container: Input area and submit button
# with left_top:
# user_sentence = st.text_area("Enter your question in English", key="user_sentence", height=150)
# st.button("submit", key="submit_button", on_click=submit_text_callback)
# # (The previous Stick Enquiry button has been removed)
# if st.session_state.submitted_text:
# # Left Bottom: Centered "解籤/Stick Enquiry" button
# with left_bottom:
# # Add vertical spacing to approximately center the button vertically
# for _ in range(5):
# st.write("")
# col1, col2, col3 = st.columns(3)
# with col2:
# st.button("Cfu Explain", key="stick_button", on_click=stick_enquiry_callback)
# if st.session_state.stick_clicked:
# # st.write("Here are the stick enquiry words...") # Placeholder text
# st.text_area(' ', value="Here are the stick enquiry words...", height=300, disabled=True)
# # ---- Right Column ----
# with right_col:
# # Top container: Fortune image area
# with st.container():
# col_left, col_center, col_right = st.columns([1, 2, 1])
# with col_center:
# if st.session_state.submitted_text and st.session_state.fortune_row:
# header_link = st.session_state.fortune_row.get("HeaderLink")
# if header_link:
# # Download the image from the URL
# img_from_url = download_and_resize_image(header_link)
# if img_from_url:
# st.image(img_from_url, use_container_width=False)
# else:
# # Fallback: display a default image if download fails
# img = load_and_resize_image("error.png")
# if img:
# st.image(img, use_container_width=False)
# else:
# # Fallback: display a default image if no header link is provided
# img = load_and_resize_image("error.png")
# if img:
# st.image(img, use_container_width=False)
# else:
# # Before submit, show the default image
# img = load_and_resize_image("fortune.png")
# if img:
# st.image(img, caption="Your Fortune", use_container_width=False)
# # Bottom container: Display fortune details using text areas
# with st.container():
# if st.session_state.fortune_row:
# header_text = st.session_state.fortune_row.get("Header", "N/A")
# luck_text = st.session_state.fortune_row.get("Luck", "N/A")
# description_text = st.session_state.fortune_row.get("Description", "No description available.")
# detail_text = st.session_state.fortune_row.get("Detail", "No detail available.")
# # Create a summary with larger text using HTML styling
# summary = f"""
# <div style="font-size: 28px; font-weight: bold;">
# Fortune stick number: {st.session_state.fortune_number}<br>
# Luck: {luck_text}
# </div>
# """
# st.markdown(summary, unsafe_allow_html=True)
# # Second text area: Description
# st.text_area("Description", value=description_text, height=150, disabled=True)
# # Third text area: Detail
# st.text_area("Detail", value=detail_text, height=150, disabled=True)