Streamlit AgGrid表格修改后无法更新值的问题排查与解决
问题原因
- Streamlit每次用户交互(如点击按钮)会重新执行整个脚本,你当前代码中每次点击Update都会重新用初始
df生成表格,导致grid_table永远是初始数据。 - 未使用Streamlit的Session State持久化修改后的数据,交互后修改内容直接丢失。
- AgGrid参数配置错误:
data_return_mode=DataReturnMode.AS_INPUT会返回原始输入而非修改后的数据,无法捕获UI中的编辑内容。
修复方案
通过Streamlit Session State保存修改后的数据,调整AgGrid参数确保正确返回编辑结果,修改后的完整代码如下:
import streamlit as st import pandas as pd from st_aggrid import AgGrid, GridOptionsBuilder, DataReturnMode, AgGridTheme from metrics.get_metrics import get_data from metrics.config import PATH_SAMPLES filename: str = 'updated_sample.csv' save_path = PATH_SAMPLES.joinpath(filename) def generate_agrid(data: pd.DataFrame): gb = GridOptionsBuilder.from_dataframe(data) gb.configure_default_column(editable=True) gb.configure_pagination(paginationAutoPageSize=True) gb.configure_side_bar() gb.configure_selection('multiple', use_checkbox=True, groupSelectsChildren="Group checkbox select children") gridOptions = gb.build() grid_response = AgGrid( data, gridOptions=gridOptions, # 修改返回模式为捕获所有修改后的数据 data_return_mode=DataReturnMode.VALUE_CHANGED, # 设置为值变化时自动更新 update_on='VALUE_CHANGED', fit_columns_on_grid_load=False, theme=AgGridTheme.STREAMLIT, enable_enterprise_modules=True, height=350, width='100%', # 关闭自动重载原始数据,避免覆盖修改 reload_data=False ) return grid_response def update(filename: str = 'updated_sample.csv'): save_path = PATH_SAMPLES.joinpath(filename) # 从Session State读取最新修改的数据 st.session_state.updated_df.to_csv(save_path, index=False) st.success("数据已成功保存到CSV!") # 初始化Session State,首次加载时存入原始数据 if 'updated_df' not in st.session_state: st.session_state.updated_df = get_data() if __name__ == '__main__': # 用Session State中的当前数据生成表格 grid_table = generate_agrid(st.session_state.updated_df) # 将AgGrid返回的修改后的数据更新到Session State if grid_table['data'] is not None: st.session_state.updated_df = pd.DataFrame(grid_table['data']) # 点击按钮时调用保存函数,直接从Session State取最新数据 st.sidebar.button("Update", on_click=update)
关键修改点说明
- 新增
st.session_state.updated_df持久化数据,确保每次脚本重跑时能保留修改后的内容。 - 修改AgGrid的
data_return_mode为DataReturnMode.VALUE_CHANGED,确保返回编辑后的完整数据。 - 关闭
reload_data=True,避免每次重跑时用原始数据覆盖修改后的表格。 update函数直接从Session State读取最新数据,无需传递grid_table参数,避免传递过时的初始数据。
内容的提问来源于stack exchange,提问作者The Dan
相关产品推荐
相关产品推荐

