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

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()

关键逻辑说明

  1. 会话状态控制选中状态:用st.session_state.selected_parent记录当前选中的父选项,确保页面刷新后状态不丢失。
  2. 逐个渲染父选项:遍历每个父选项,单独渲染按钮和对应的子选项容器,子选项仅在该选项被选中时显示。
  3. 自定义单选逻辑:通过按钮点击事件切换选中状态,替代原生st.radio的整体渲染方式,实现子选项嵌入父选项下方的效果。
  4. 动态生成编号:根据父选项类型和子选项输入值,实时生成对应格式的编号。

这种方式既保留了单选的逻辑,又能让子选项精准显示在选中的父选项下方,未选中的父选项仍可点击切换,完全满足修改需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:35:04