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

如何在Streamlit表单中仅当指定选项选中时显示下拉字段

解决Streamlit表单内动态显示下拉框的问题

你的猜测是对的:Streamlit表单内的组件(除提交按钮外)在用户交互时不会触发整个脚本重新运行,所以drop_down_1的选择变化无法实时更新is_drop_down_2_disabled的值,直到点击提交按钮,这就导致你的代码无法实时控制第二个下拉框的显示状态。

下面提供两种可行的实现方式:

方式一:将第一个下拉框移到表单外

这种方式最简单,利用Streamlit的默认特性——表单外的组件交互会实时触发页面重跑,从而动态控制表单内第二个下拉框的显示:

import streamlit as st

# 第一个下拉框放在表单外
drop_down_1 = st.selectbox("Dropdown 1", ["Option 1", "Option 2"])

with st.form("my_form"):
    text_input_1 = st.text_input("Input 1")

    # 根据外部下拉框的选择决定是否渲染第二个下拉框
    if drop_down_1 == 'Option 1':
        drop_down_2 = st.selectbox("Dropdown 2", ["Option 3", "Option 4"])
    else:
        # 未选中指定值时,可设置默认值或留空(提交时需注意数据处理)
        drop_down_2 = None

    submitted = st.form_submit_button("Submit")
    if submitted:
        st.text('Form Submitted!')
        if drop_down_2:
            st.write(f"你选择了: {drop_down_1}, {drop_down_2}")

方式二:在表单内使用Session State实时更新

如果必须把第一个下拉框放在表单内,可以通过st.session_state保存选择状态,并利用on_change回调触发页面重跑,实现实时动态显示:

import streamlit as st

# 初始化Session State,保存第一个下拉框的选择值
if 'drop_down_1_val' not in st.session_state:
    st.session_state.drop_down_1_val = "Option 2"

def update_dropdown_state():
    # 更新Session State并触发页面重跑
    st.session_state.drop_down_1_val = st.session_state.temp_dropdown
    st.rerun()

with st.form("my_form"):
    text_input_1 = st.text_input("Input 1")

    # 第一个下拉框绑定Session State和回调函数
    drop_down_1 = st.selectbox(
        "Dropdown 1", 
        ["Option 1", "Option 2"],
        key="temp_dropdown",
        on_change=update_dropdown_state,
        index=["Option 1", "Option 2"].index(st.session_state.drop_down_1_val)
    )

    # 根据Session State的值决定是否显示第二个下拉框
    if st.session_state.drop_down_1_val == 'Option 1':
        drop_down_2 = st.selectbox("Dropdown 2", ["Option 3", "Option 4"])
    else:
        drop_down_2 = None

    submitted = st.form_submit_button("Submit")
    if submitted:
        st.text('Form Submitted!')
        if drop_down_2:
            st.write(f"你选择了: {drop_down_1}, {drop_down_2}")

补充说明

  • 方式一适合对布局要求不高的场景,实现简单,无需额外状态管理。
  • 方式二更适合需要将所有组件放在表单内的场景,通过Session State跟踪选择状态,回调触发重跑实现实时更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:35:30