You need to enable JavaScript to run this app. 如何在Streamlit网站运行时动态添加可持久留存的带标签输入框
优惠活动
大模型
产品
解决方案
定价
更多

如何在Streamlit网站运行时动态添加可持久留存的带标签输入框

Streamlit 动态新增输入框的官方标准实现

核心机制说明

每次交互触发全量代码重跑、动态定义的变量重置为初始值,是Streamlit的固定运行逻辑。框架针对这类需要跨重跑周期留存状态的场景,设计了原生的会话级持久化机制——st.session_state,完全不需要依赖本地文件读写实现状态留存,这也是Streamlit官方文档明确推荐的实现路径。
本地文件读写的方案本质是绕开框架机制的旁路实现,不仅性能差,还会存在多用户并发时的文件写入冲突问题,不符合生产使用的规范。

原参考代码的核心缺陷

原代码中user_added_params = {}属于普通局部变量,每次代码重跑时都会被重新初始化为空字典,无法存储用户之前点击新增的输入框配置,直接导致组件刚创建就消失。

官方方案实现逻辑

  • 所有需要跨重跑周期留存的配置(包括用户已新增输入框的自定义标签、输入类型),全部存储在st.session_state维护的专属结构中,仅在用户会话第一次加载时完成初始化
  • 点击“新增输入框”按钮时,不直接渲染组件,而是把当前选择的输入类型、填写的自定义标签作为一条配置项,追加到session_state的配置列表中
  • 每次代码重跑时,遍历session_state中存储的所有配置项,逐次渲染对应的输入组件;组件的用户输入值会被Streamlit自动托管,不会因为重跑丢失

可直接运行的修正代码

import streamlit as st

# 会话级状态初始化,仅在会话首次加载时执行一次
if "user_added_params" not in st.session_state:
    # 存储结构为 [{标签: 自定义文本, 数据类型: Number/Text/True/False}, ...]
    st.session_state.user_added_params = []

def render_entry(config):
    """根据传入的配置渲染对应类型的输入组件"""
    label = config["label"]
    data_type = config["data_type"]
    if data_type == "Number":
        return st.number_input(label, key=f"input_{label}")
    elif data_type == "Text":
        return st.text_input(label, key=f"input_{label}")
    elif data_type == "True/False":
        return st.checkbox(label, key=f"input_{label}")

# 顶部新增输入框的操作区域
col_btn, col_type, col_label = st.columns(3)
with col_type:
    selected_type = st.selectbox("输入类型", options=["Number", "Text", "True/False"])
with col_label:
    custom_label = st.text_input("自定义参数标签")
with col_btn:
    if st.button("新增输入框"):
        # 校验标签非空,避免创建无效组件
        if custom_label.strip():
            st.session_state.user_added_params.append({
                "label": custom_label.strip(),
                "data_type": selected_type
            })

# 分隔渲染所有已创建的输入组件
st.divider()
st.subheader("已创建的输入组件")
for param_config in st.session_state.user_added_params:
    render_entry(param_config)

实现特性

  • 支持按需新增任意数量的输入框,所有组件会在当前用户的整个会话周期内持续留存,不会随主循环重跑被重置
  • 全程依赖Streamlit原生的session_state机制,无本地文件读写操作,符合框架官方设计规范,不存在多用户并发写入冲突风险
  • 给每个输入组件设置唯一key值,可避免不同组件的状态串扰,保证用户已输入的内容在页面重跑时不会丢失
  • 组件的用户输入值会被Streamlit自动托管在st.session_state中,无需手动编写值更新逻辑

内容的提问来源于stack exchange,提问作者csulli245

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 20:24:07