Hi @ferdy, thanks for responding.
Here is a dummy code for what the same.
Test Code
home.py
import streamlit as st
st.title("My testings page of streamlit")
testings.py
import streamlit as st
TASKS = {
"task1": {
"input": {
"input1": "string",
"input2": "string",
},
},
"task2": {
"input": {
"input3": "string"
},
}
}
st.toast(st.session_state.get("selected_tasks", []))
st.session_state.selected_tasks = st.multiselect("Select tasks to be performed:", TASKS.keys(), help = "Select the tasks to be performed by the backend server. You can select multiple tasks.", default = st.session_state.get("selected_tasks", []))
if not st.session_state.val_input:
st.session_state["val_input"] = {}
if st.button("Give Input", help = "Provide inputs to the your selected tasks. Note: It is not compulsary to fill all of them.") or st.session_state.self_input_button:
st.session_state.self_input_button = True
for task in st.session_state.selected_tasks:
# Get input for each task
for key, val_type in TASKS[task].get("input", {}).items():
help = f"Please provide input for `{key}` of type `{val_type}`."
if val_in := st.text_input(f"{task.capitalize()} - {key} ({val_type}):", help = help, value = st.session_state.val_input.get(key, "")):
st.session_state.val_input[key] = val_in
st.subheader("Query Obtained", help = "Note that default values will be used for any parameters that you did not provide input for.")
st.json(st.session_state.val_input)
and home.py
import streamlit as st
# Initialize session state variables
# Global variables for session state initialization
NONE_INIT_KEYS = [
"selected_tasks", "self_selection", "val_input",
]
FALSE_INIT_KEYS = [
"self_input_button",
]
# Initialize session state variables
for key in NONE_INIT_KEYS:
if key not in st.session_state:
st.session_state[key] = None
for key in FALSE_INIT_KEYS:
if key not in st.session_state:
st.session_state[key] = False
# Page Setup
intro_page = st.Page(
page = "home.py",
title = "Home",
icon = ":material/home:",
default = True,
)
server_response_page = st.Page(
page = "testings.py",
title = "Server Response",
icon = ":material/rocket_launch:",
)
## Navigation
pg = st.navigation(pages = [
intro_page,
server_response_page,
])
for state in (NONE_INIT_KEYS + FALSE_INIT_KEYS):
st.session_state[state] = st.session_state[state]
## Run
pg.run()
with st.sidebar:
if st.checkbox("Show Session State", value=False, help = "Session State values, used for debugging."):
st.sidebar.write("Session State:")
st.sidebar.json(st.session_state)
This is a small snippet from my code, and much simplified too. I tried to maintain the data(using default values) when I come back to the page, which sorta works but has glitches.
Try to Select task1, and task2, you will see a glitch of unselecting task2
. Thats one bug.
This is simplified, but if I have to get server responses, is there a shorter way of showing server responses after I come back from a different page. Example below
if st.button("Generate response"):
get_response_function(st.session_state.server_response):
Do I have to do
if not st.session_state.server_response:
# show response
else: # means previously generated, and I am coming back from HOME page
# Above snippet of generating response
Thanks!