Streamlit多页面应用切换时如何防止页面刷新及输入内容丢失?
Streamlit多页面应用切换时如何防止页面刷新及输入内容丢失?
兄弟我太懂这种痛点了!刚上手Streamlit多页面的时候,切个页面回来之前填的东西全没了,简直离谱😅。其实问题根源很简单:Streamlit默认每切换一次页面,就会重新执行对应页面的整个脚本,之前的输入自然就被清空了。解决这个的核心就是用**Streamlit的会话状态(Session State)**来持久化用户数据,下面给你一步步讲怎么改:
核心思路:用Session State绑定用户输入
st.session_state是Streamlit内置的一个全局字典,专门用来在用户的整个会话周期(只要浏览器标签不关)里保存数据。不管你怎么切页面,只要把用户输入和这个字典里的变量绑定,数据就不会丢。
修改后的代码示例
1. 改造页面1(pages/1_page1.py)
把多选框的选中值和会话状态绑定,每次选择后自动更新状态:
import streamlit as st # 先初始化会话状态里的变量,如果还没创建的话 if "favorite_colors" not in st.session_state: st.session_state.favorite_colors = [] # 把多选框的value和session_state里的变量绑定 options = st.multiselect( "What are your favorite colors?", ["Green", "Yellow", "Red", "Blue"], value=st.session_state.favorite_colors # 关键:用会话状态的值作为默认选中项 ) # 每次用户选择后,把新值存回会话状态 st.session_state.favorite_colors = options st.write("You selected:", options)
2. 页面2可加验证(pages/2_page2.py)
页面2本身不需要大改,但可以加个显示,验证数据确实被保存了:
import streamlit as st st.write("This is the second page!") # 显示从页面1保存的内容,证明数据没丢 if "favorite_colors" in st.session_state: st.write("🔖 你在页面1选的颜色还在哦:", st.session_state.favorite_colors)
3. 入口文件app.py(无需修改,也可统一初始化)
如果你的多页面有很多需要持久化的变量,也可以在app.py里统一初始化,这样每个页面不用重复写判断:
import streamlit as st st.set_page_config( page_title="Hello", page_icon="👋", ) # 统一初始化所有需要持久化的会话状态 if "favorite_colors" not in st.session_state: st.session_state.favorite_colors = []
额外小技巧
- 重置数据:如果需要让用户清空保存的内容,可以加个重置按钮:
if st.button("🔄 重置选中的颜色"): st.session_state.favorite_colors = [] st.rerun() # 刷新页面显示重置后的状态 - 多变量持久化:不管是输入框、下拉框还是开关,只要把
value属性和st.session_state里的变量绑定,都能实现持久化,逻辑和上面的多选框完全一样。
这样改完之后,你再切页面试试,之前选的颜色肯定会乖乖待在那儿,再也不会失踪啦!




