Hello Streamlit Community,
I am a student and, as part of a final project for a Data Visualization class, my team is using Streamlit to deploy a simple dashboard. We managed to get a working implementation of our dashboard running, but there is a bug in our design of the callback functions. Changes to the dashboard only take effect after the submit button has been clicked twice. See this YouTube video for a demonstration. Our programing skills are basic and we are new to Streamlit, so the code is pretty hacky. But, the overall flow is this:
- We load a csv file into a panda’s dataframe.
- We set default values for the variables and define the two call back functions, seg_val_tracker and quartile_val_tracker
- The dashboard is rendered.
- When the user adjusts the form at the bottom of the page and hits submit, the dashboard updates.
- The problem is with the callback function in the form. This code reads:
with st.form("segment_form"): st.header("Factors") race_val = st.selectbox("Race", race_dropdown_vals, help="select a value") income_val = st.select_slider("Income", options = income_slider_vals, help = "select a value") internet_val = st.select_slider("Internet availability", options = internet_dropdown_vals, help = "select a value") submitted = st.form_submit_button("Submit", on_click=seg_val_tracker, #The code below passes segment values to the callback function args=(race_val, income_val, internet_val, target_hours_val, ))
The code for the callback function is
def seg_val_tracker(race_val, income_val, internet_val, target_hours_val): new_seg_val = pred_df[(pred_df["RACE_ETHNICITY"] == race_val) \ & (pred_df["INCOME"] == income_slider_vals.index(income_val) + 1)\ & (pred_df["INTRNTAVAIL"] == internet_dropdown_vals[::-1].index(internet_val) + 1)\ & (pred_df["SCHLHRS"] == target_hours_val)].iloc[:,].values.astype(float) st.session_state["segment_val"] = float(new_seg_val) * 100
The function is a mess, but basically it filters the dataframe and returns the value the user selected. The filtering works as intended. The only problem is with the dashboard updating. As I say, it takes two clicks of the submit button.
The app is in a public repo here: streamlit-app/app.py at master · ikerson/streamlit-app · GitHub
It is deployed here: http://22.214.171.124:8501/
Thank you for reading this long question and any help you can provide.