如何在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
相关产品推荐
相关产品推荐

