You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里选两个复选框就出问题了:

  1. 第一次选择没问题,能正确保存
  2. 第二次选择会触发表格更新,但这次选择的信息既没存在st.session_state['saved_i']里,也没出现在grid_response_2.event_data里
  3. 结果就是第二次选的复选框状态直接丢了,哪里都没保存下来

我已经尝试过的方法

  • 检查了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:33:03