You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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里的变量绑定,都能实现持久化,逻辑和上面的多选框完全一样。

这样改完之后,你再切页面试试,之前选的颜色肯定会乖乖待在那儿,再也不会失踪啦!

火山引擎 最新活动