Streamlit-AgGrid中连续选择复选框时状态无法持久化的问题求助
Streamlit-AgGrid中连续选择复选框时状态无法持久化的问题求助
我现在在用Python的streamlit-aggrid组件,遇到了动态更新表格时复选框状态没法持久保存的问题,想请教大家怎么解决。
问题背景
- 我用到了三个DataFrame:
df_1:主表格,内容是可以更新的df_2:是df_1的子集,里面的复选框用来做选择操作df_3:用来把选中的索引存在st.session_state['saved_i']里,本来是想保证df_1更新后之前的选择还能保留
具体问题
当df_1更新后,df_2里的复选框状态是能正确保存的,但如果连续在df_2里选两个复选框就出问题了:
- 第一次选择没问题,能正确保存
- 第二次选择会触发表格更新,但这次选择的信息既没存在
st.session_state['saved_i']里,也没出现在grid_response_2.event_data里 - 结果就是第二次选的复选框状态直接丢了,哪里都没保存下来
我已经尝试过的方法
- 检查了
grid_response_2.event_data,确实没有第二次选择的记录 - 试着在更新前手动保存索引,也没起作用
我的疑问
怎么才能保证所有复选框的选择都正确存在st.session_state里呢?我希望df_2能一直保留所有选中复选框的状态。
我的代码
import pandas as pd import streamlit as st import numpy as np from st_aggrid import AgGrid, GridOptionsBuilder, JsCode, GridUpdateMode ################################################################################# # Creating df: df = pd.DataFrame({ 'i': range(20), 'Values': [f'P{i}' for i in range(20)] }) df['Selected'] = False ################################################################################# col1, col2 = st.columns(2) # Creating grid (df): gb = GridOptionsBuilder.from_dataframe(df) gb.configure_default_column(editable=True, groupable=True, resizeable=True) grid_options = gb.build() with col1: grid_response = AgGrid(df, gridOptions=grid_options, fit_columns_on_grid_load=False, height=250, ) ################################################################################# # Creating df_2: df_2 = grid_response.data.loc[grid_response.data['Selected']].copy() df_2['Selected'] = False # Pre-selecting the checkboxes from the previous interaction: if 'saved_i' in st.session_state: i_df_2 = df_2.index i_df_3 = st.session_state['saved_i'] select = i_df_3[np.isin(i_df_3, i_df_2)] df_2.loc[select, 'Selected'] = True ################################################################################# # Creating grid (df_2) if not df_2.empty: gb_2 = GridOptionsBuilder.from_dataframe(df_2) gb_2.configure_default_column(editable=True, groupable=True, resizeable=True) gb_2.configure_column('Selected', sort='desc') grid_options_2 = gb_2.build() with col2: grid_response_2 = AgGrid(df_2, gridOptions=grid_options_2, fit_columns_on_grid_load=False, height=250) ################################################################################# # Creating df_3 with selected checkboxes from df_2: df_3 = grid_response_2.data.loc[grid_response_2.data['Selected']].copy() ################################################################################# # Saving indexes in session for the next update: if not df_3.empty: st.session_state['saved_i'] = df_3["i"].astype(str)
备注:内容来源于stack exchange,提问作者Arthur Stackoverflow
相关产品推荐
相关产品推荐

