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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:10:33