如何阻止Streamlit动态生成输入字段修改后页面重载重置?
解决Streamlit动态输入字段重置问题
我正在开发一个Streamlit应用,允许用户指定所需的输入字段数量。问题在于,当修改任意动态生成的输入字段值时,所有动态输入字段都会被重置,但其他非动态字段(如multiplier)不会受影响。我已尝试使用st.form,但并未解决问题。相关代码如下:
import streamlit as st import pandas as pd from random import randint @st.cache def load_csv(): return pd.read_csv("data.csv"), pd.read_csv("categories.csv") df, df_cat = load_csv() num_inputs = int(st.number_input("Number of inputs", value=1, min_value=1)) input_data = { "Input": [], "Category": [], "Value": [] } for i in range(num_inputs): cols = st.columns(2) with cols[0]: selected = st.selectbox("Selectbox", df["Reuse"], key=i+randint(0,1000)) input_data["Input"].append(selected) input_data["Category"].append(df_cat[df_cat["selection"] == selected]["Category"].to_list()[0]) with cols[1]: input_data["Value"].append(st.number_input("Value", value=0, min_value=0, key=i+randint(0,1000))) multiplier = st.number_input("Multiplier", value=0, min_value=0, key=i+randint(0,1000)) # irrelevant code from here
问题出在动态生成的key逻辑上——你用randint(0,1000)给每个组件生成key,每次Streamlit脚本重新运行(比如修改输入字段值触发页面刷新时),这些key都会随机变化。Streamlit是通过key来识别组件、保留用户输入状态的,key一旦改变,组件会被判定为全新的实例,之前输入的值自然会被重置。
把随机生成key的逻辑去掉,改用固定的、和循环索引绑定的key即可解决问题。修改后的代码如下:
import streamlit as st import pandas as pd @st.cache def load_csv(): return pd.read_csv("data.csv"), pd.read_csv("categories.csv") df, df_cat = load_csv() num_inputs = int(st.number_input("Number of inputs", value=1, min_value=1)) input_data = { "Input": [], "Category": [], "Value": [] } for i in range(num_inputs): cols = st.columns(2) with cols[0]: # 用固定格式的key,与循环索引绑定 selected = st.selectbox("Selectbox", df["Reuse"], key=f"selectbox_{i}") input_data["Input"].append(selected) input_data["Category"].append(df_cat[df_cat["selection"] == selected]["Category"].to_list()[0]) with cols[1]: # 同理使用固定key input_data["Value"].append(st.number_input("Value", value=0, min_value=0, key=f"value_{i}")) # 给multiplier设置固定key multiplier = st.number_input("Multiplier", value=0, min_value=0, key="multiplier_input") # 后续无关代码
修改逻辑说明:
- 每个动态组件的key唯一且固定(比如
selectbox_0、value_1),Streamlit能正确识别同一组件实例,保留用户输入的状态。 - 即使修改字段值触发脚本重跑,组件key不变,状态也不会被重置。
内容的提问来源于stack exchange,提问作者Vedant Jumle
相关产品推荐
相关产品推荐

