Streamlit单选组件实现选中选项下方展示子选项的需求求助
Streamlit单选组件子选项嵌入父选项下方实现方案
要实现选中父选项后子选项直接显示在该选项下方、未选中选项仍可切换的效果,Streamlit原生st.radio无法直接满足需求,需要结合**会话状态(session_state)**和逐个渲染父选项的方式来实现。以下是具体代码示例:
import streamlit as st # 初始化会话状态,记录当前选中的父选项 if "selected_parent" not in st.session_state: st.session_state.selected_parent = None # 定义父选项列表,可根据实际需求修改 parent_options = ["设备类型A", "设备类型B", "设备类型C"] # 遍历渲染每个父选项及对应的子选项区域 for option in parent_options: # 用按钮模拟单选逻辑:点击时切换选中状态 if st.button(option, key=f"parent_btn_{option}"): st.session_state.selected_parent = option # 若当前选项为选中状态,渲染对应的子选项 if st.session_state.selected_parent == option: st.markdown(f"### {option} 配置项") # 不同父选项对应不同数量/类型的子选项 if option == "设备类型A": sub1 = st.text_input("设备编号前缀") sub2 = st.number_input("设备序号", min_value=1, step=1) # 生成编号 if sub1 and sub2: st.info(f"生成编号:{sub1}-{sub2}") elif option == "设备类型B": sub1 = st.selectbox("所属区域", ["华东区", "华北区", "华南区"]) sub2 = st.date_input("出厂日期") sub3 = st.text_input("批次号") if sub1 and sub2 and sub3: st.info(f"生成编号:B-{sub1[:2]}-{sub2.strftime('%Y%m')}-{sub3}") elif option == "设备类型C": sub1 = st.slider("功率等级", 100, 500, step=50) if sub1: st.info(f"生成编号:C-P{sub1}") # 添加分隔线区分不同父选项 st.divider()
关键逻辑说明
- 会话状态控制选中状态:用
st.session_state.selected_parent记录当前选中的父选项,确保页面刷新后状态不丢失。 - 逐个渲染父选项:遍历每个父选项,单独渲染按钮和对应的子选项容器,子选项仅在该选项被选中时显示。
- 自定义单选逻辑:通过按钮点击事件切换选中状态,替代原生
st.radio的整体渲染方式,实现子选项嵌入父选项下方的效果。 - 动态生成编号:根据父选项类型和子选项输入值,实时生成对应格式的编号。
这种方式既保留了单选的逻辑,又能让子选项精准显示在选中的父选项下方,未选中的父选项仍可点击切换,完全满足修改需求。
内容的提问来源于stack exchange,提问作者Matthias Wolf
相关产品推荐
相关产品推荐

