You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:35:15