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

如何在Streamlit中点击按钮后刷新AgGrid的数据视图?

Streamlit AgGrid删除行后视图不刷新的解决方法

我开发了一个带退订功能的Streamlit应用,用AgGrid展示数据,用户选择行后点击Delete按钮删除对应条目。目前CSV文件能正常更新,但AgGrid视图不会同步刷新,导致用户可能重复操作。

问题核心在于Streamlit的重跑执行机制:每次用户交互(比如点击按钮),整个脚本会重新执行一遍。原来的代码中,删除操作完成后没有重新加载最新数据并触发AgGrid的重新渲染,所以页面显示的还是旧数据。

我们可以通过Streamlit的st.session_state来管理数据状态,确保每次重跑时都能获取到最新的数据,具体修改如下:

修改后的完整代码

import pandas as pd
import streamlit as st
from st_aggrid import AgGrid, GridUpdateMode, DataReturnMode
from st_aggrid.grid_options_builder import GridOptionsBuilder


def make_aggrid_table(data: pd.DataFrame, key: str) -> pd.DataFrame:
    """创建AgGrid表格并返回选中行"""
    gb = GridOptionsBuilder.from_dataframe(data, min_column_width=100)
    gb.configure_default_column(wrapText=True, autoHeight=True)
    gb.configure_selection('multiple', use_checkbox=True,
                           groupSelectsChildren="Group checkbox select children")
    gb.configure_side_bar()
    grid_options = gb.build()

    grid_response = AgGrid(
        data,
        gridOptions=grid_options,
        data_return_mode=DataReturnMode.AS_INPUT,
        update_mode=GridUpdateMode.MODEL_CHANGED,
        fit_columns_on_grid_load=True,
        theme='dark',
        enable_enterprise_modules=True,
        height=370,
        reload_data=True,  # 开启数据自动重载
        wrap_text=True,
        resizeable=True,
        key=key
    )
    selected = grid_response['selected_rows']
    return pd.DataFrame(selected)

# 用session_state持久化数据,避免每次重跑重置
if 'some_csv' not in st.session_state:
    # 首次运行初始化CSV
    init_data = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]}, index=range(3))
    init_data.to_csv('some_file.csv')
    st.session_state.some_csv = pd.read_csv('some_file.csv', index_col=0)

# 渲染最新数据的AgGrid表格
selection = make_aggrid_table(st.session_state.some_csv, 'some_key')

if not selection.empty:
    delete = st.button('Delete')
    if delete:
        # 直接更新session_state中的数据
        st.session_state.some_csv = st.session_state.some_csv.drop(selection.index)
        # 保存到CSV文件
        st.session_state.some_csv.to_csv('some_file.csv')
        # 可选:添加操作反馈
        st.success(f"已成功删除{len(selection)}行数据")

关键修改说明

  • 用st.session_state.some_csv存储数据集,确保每次重跑时都能获取到最新的状态,不会被局部变量覆盖
  • 将AgGrid的reload_data参数设为True,确保数据变化时表格自动重新加载
  • 删除操作直接修改st.session_state中的数据,而不是局部变量,让下一次重跑时AgGrid能渲染更新后的数据
  • 初始化逻辑放在if 'some_csv' not in st.session_state:判断中,避免每次重跑都重新创建原始CSV文件

内容的提问来源于stack exchange,提问作者Travasaurus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:15:11