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

Streamlit中实现关联依赖式下拉菜单选型功能求助

Streamlit动态联动下拉菜单实现方案

核心思路

  1. 用st.session_state存储各字段选择值,确保交互过程中状态不丢失
  2. 定义明确的过滤规则映射表,对应不同选择下的可选选项
  3. 每个下拉菜单的选项根据其他字段的当前选择动态生成,保留「➕ Add new」选项
  4. 选择「➕ Add new」时跳过过滤逻辑,维持全量可选选项

完整代码实现

import streamlit as st

# 初始化会话状态,避免首次加载报错
if "grade_selected" not in st.session_state:
    st.session_state.grade_selected = None
if "shape_selected" not in st.session_state:
    st.session_state.shape_selected = None
if "color_selected" not in st.session_state:
    st.session_state.color_selected = None

# 基础选项列表(包含「➕ Add new」)
BASE_GRADES = ["A", "X", "Y", "➕ Add new"]
BASE_SHAPES = ["B", "D", "X", "Y", "➕ Add new"]
BASE_COLORS = ["Z", "其他颜色", "➕ Add new"]

# 过滤规则定义
FILTER_RULES = {
    # Grade选A时,Shape的可选值
    "grade_A": ["B", "D", "➕ Add new"],
    # Color选Z时,Grade的可选值
    "color_Z": ["X", "Y", "➕ Add new"],
    # Color选Z时,Shape的可选值
    "color_Z_shape": ["X", "Y", "➕ Add new"]
}

# 动态生成Grade选项
def get_filtered_grades():
    if st.session_state.color_selected == "Z" and st.session_state.color_selected != "➕ Add new":
        return FILTER_RULES["color_Z"]
    return BASE_GRADES

# 动态生成Shape选项
def get_filtered_shapes():
    if st.session_state.color_selected == "Z" and st.session_state.color_selected != "➕ Add new":
        return FILTER_RULES["color_Z_shape"]
    elif st.session_state.grade_selected == "A" and st.session_state.grade_selected != "➕ Add new":
        return FILTER_RULES["grade_A"]
    return BASE_SHAPES

# 页面布局
st.title("物料创建应用")

# Grade下拉菜单
grade = st.selectbox(
    "选择Grade",
    options=get_filtered_grades(),
    key="grade_selected"
)

# Shape下拉菜单
shape = st.selectbox(
    "选择Shape",
    options=get_filtered_shapes(),
    key="shape_selected"
)

# Color下拉菜单
color = st.selectbox(
    "选择Color",
    options=BASE_COLORS,
    key="color_selected"
)

# 展示当前选择
st.subheader("当前选择")
st.write(f"Grade: {grade}")
st.write(f"Shape: {shape}")
st.write(f"Color: {color}")

关键细节说明

  • 状态管理:st.session_state是实现动态联动的核心,它能在Streamlit的交互循环中保留用户的选择状态
  • 过滤逻辑优先级:当多个过滤条件同时触发时(比如同时选了Grade=A和Color=Z),代码中优先遵循Color的过滤规则,可根据需求调整判断顺序
  • 「➕ Add new」处理:所有过滤判断都排除了该选项,确保用户选择它时不会触发过滤,保持全量选项可用

扩展方向

  • 如果需要更复杂的多条件组合过滤,可以将FILTER_RULES改成嵌套字典,支持多字段组合的规则定义
  • 若要实现「➕ Add new」后添加自定义选项,可以在检测到该选择时弹出输入框,将新选项追加到基础列表并更新会话状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 17:42:34