Ostatnio aktywny 9 months ago

透過 st.session_state 讓 Streamlit 應用能夠保存並管理可編輯的 DataFrame,避免頁面重整導致資料丟失,適用於數據管理與即時編輯應用。

streamlit_session_state.py Surowy
1import streamlit as st
2import pandas as pd
3
4def main():
5 # 初始化 session_state
6 if "data" not in st.session_state:
7 st.session_state.data = pd.DataFrame({
8 "ID": [1, 2, 3],
9 "Name": ["Alice", "Bob", "Charlie"],
10 "Age": [25, 30, 35],
11 "OtherField": ["Edit me", "Edit me too", "Also editable"]
12 })
13 if "edited_data" not in st.session_state:
14 st.session_state.edited_data = None
15 if "is_submitted" not in st.session_state:
16 st.session_state.is_submitted = False
17
18 # 介面標題與說明
19 st.title("可編輯的 DataFrame 範例")
20 st.header("請編輯表格內容,並點擊 '更新資料' 以儲存變更。")
21
22 # 編輯 DataFrame
23 edited_df = st.data_editor(
24 st.session_state.data,
25 num_rows="fixed",
26 key="editable_table",
27 use_container_width=True,
28 column_config={
29 "ID": st.column_config.NumberColumn("ID", disabled=True), # 禁止編輯 ID
30 "OtherField": st.column_config.TextColumn("OtherField") # 允許編輯 OtherField
31 },
32 )
33
34 # 按鈕:儲存編輯後的資料
35 if st.button("更新資料"):
36 st.session_state.edited_data = edited_df
37 st.session_state.is_submitted = True
38 st.success("變更已儲存!")
39
40 # 更新 session_state 的資料
41 if st.session_state.edited_data is not None and st.session_state.is_submitted:
42 st.session_state.data = st.session_state.edited_data
43 st.success("資料已更新!")
44 st.session_state.edited_data = None
45 st.session_state.is_submitted = False
46
47 # 顯示目前資料
48 st.subheader("目前資料:")
49 st.dataframe(st.session_state.data)
50
51if __name__ == "__main__":
52 main()
53