Hello, I’m new to Streamlit and I appreciate if you could suggest solutions for the issue I’m having.
Idea
The idea is to get edited values in “edited_col” column on submit (so that I can update database record).
Issue
The issue I’m having is that I have to click Submit button twice to get it to work. Also the table value unexpectedly reset value as well.
Potential Cause
I think it is caused by the data_editor not returning the edited result at the button onclick event.
Potential Solution?
Would you be able to tell me if there is a way to force data_editor to return the edited result? or may be better ways to make this work somehow please?
Thank you.
I’m testing script below on https://edit.share.stlite.net/
(Streamlit v1.24.0)
import streamlit as st
import pandas as pd
df = pd.DataFrame(
[
{"Type": 3, "ROW_ID": 6, "edited_col": "etc", "rating": 4, "is_widget": True},
{"Type": 1, "ROW_ID": 7, "edited_col": "st.selectbox", "rating": 4, "is_widget": True},
{"Type": 1, "ROW_ID": 8, "edited_col": "st.balloons", "rating": 5, "is_widget": False},
{"Type": 2, "ROW_ID": 9, "edited_col": "A", "rating": 3, "is_widget": True},
{"Type": 1, "ROW_ID": 10, "edited_col": "B", "rating": 3, "is_widget": True},
{"Type": 2, "ROW_ID": 11, "edited_col": "C", "rating": 3, "is_widget": True},
{"Type": 2, "ROW_ID": 12, "edited_col": "D", "rating": 3, "is_widget": True},
{"Type": 2, "ROW_ID": 13, "edited_col": "F", "rating": 3, "is_widget": True}
]
)
if "df" not in st.session_state:
st.session_state.df = df[df["Type"].isin([2])]
with st.sidebar:
if st.button("obj 1"):
st.session_state.df = df[df["Type"].isin([1])]
if st.button("obj 2"):
st.session_state.df = df[df["Type"].isin([2])]
edited_df = st.data_editor(st.session_state["df"])
if st.button("Submit"):
df = st.session_state["df"]
only_diff_df = df.compare(edited_df)
changde_df_row = df[df.index.isin(only_diff_df.index)]
for i in only_diff_df.index:
changde_df_row = df[df.index.isin([i])]
st.write("ROW_ID")
st.write(changde_df_row["ROW_ID"].item())
st.write("Chanded to ")
st.write(only_diff_df["edited_col"]["other"][only_diff_df["edited_col"]["other"].index.isin([i])].item())
st.session_state["df"] = edited_df