Streamlit中实现关联依赖式下拉菜单选型功能求助
Streamlit动态联动下拉菜单实现方案
核心思路
- 用
st.session_state存储各字段选择值,确保交互过程中状态不丢失 - 定义明确的过滤规则映射表,对应不同选择下的可选选项
- 每个下拉菜单的选项根据其他字段的当前选择动态生成,保留「➕ Add new」选项
- 选择「➕ 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
相关产品推荐
相关产品推荐

