如何解决Streamlit中st.radio选项不显示或无法选中的问题?

问题现象与核心原因

当开发者使用st.radio()创建单选按钮时,常遇到以下典型症状:

  • 选项完全不可见:组件区域空白但控制台无报错
  • 点击无响应:UI显示正常但无法切换选中状态
  • 意外重置:页面刷新后选项恢复默认值

深度技术解析

根本原因通常涉及三个层面:

  1. 容器冲突:相邻st.columns()st.expander()导致z-index堆叠问题
  2. 数据流异常:在回调函数中未正确处理session_state
  3. Key重复:动态生成选项时未设置唯一key参数

解决方案与代码示例

import streamlit as st

# 正确设置唯一key的示例
options = ["实时模式", "批量处理"]
selected = st.radio(
    "运行模式选择",
    options,
    key="operation_mode",  # 关键修复点
    index=1,
    horizontal=True
)

# 配合session_state的使用
if 'user_choice' not in st.session_state:
    st.session_state.user_choice = None
    
def on_radio_change():
    st.session_state.user_choice = selected
    
st.radio(
    "高级选项",
    ["启用GPU加速", "仅CPU运行"],
    on_change=on_radio_change  # 状态同步方案
)

布局优化技巧

当出现元素重叠时:

问题类型 解决方案
CSS层叠冲突 注入自定义样式:st.markdown("""<style>.stRadio > div {flex-direction: column;}</style>""", unsafe_allow_html=True)
移动端适配 设置horizontal=False并限制选项字符长度

高级调试方法

通过浏览器开发者工具检查:

  • DOM树中是否存在对应的input[type="radio"]元素
  • Network面板查看WebSocket连接状态
  • Console面板过滤Streamlit相关警告

性能优化建议

对于动态选项场景:

"在大型表单中,为每个st.radio添加key参数可减少30%的重新渲染时间"