如何在Streamlit表单中仅当指定选项选中时显示下拉字段
解决Streamlit表单内动态显示下拉框的问题
你的猜测是对的:Streamlit表单内的组件(除提交按钮外)在用户交互时不会触发整个脚本重新运行,所以drop_down_1的选择变化无法实时更新is_drop_down_2_disabled的值,直到点击提交按钮,这就导致你的代码无法实时控制第二个下拉框的显示状态。
下面提供两种可行的实现方式:
方式一:将第一个下拉框移到表单外
这种方式最简单,利用Streamlit的默认特性——表单外的组件交互会实时触发页面重跑,从而动态控制表单内第二个下拉框的显示:
import streamlit as st # 第一个下拉框放在表单外 drop_down_1 = st.selectbox("Dropdown 1", ["Option 1", "Option 2"]) with st.form("my_form"): text_input_1 = st.text_input("Input 1") # 根据外部下拉框的选择决定是否渲染第二个下拉框 if drop_down_1 == 'Option 1': drop_down_2 = st.selectbox("Dropdown 2", ["Option 3", "Option 4"]) else: # 未选中指定值时,可设置默认值或留空(提交时需注意数据处理) drop_down_2 = None submitted = st.form_submit_button("Submit") if submitted: st.text('Form Submitted!') if drop_down_2: st.write(f"你选择了: {drop_down_1}, {drop_down_2}")
方式二:在表单内使用Session State实时更新
如果必须把第一个下拉框放在表单内,可以通过st.session_state保存选择状态,并利用on_change回调触发页面重跑,实现实时动态显示:
import streamlit as st # 初始化Session State,保存第一个下拉框的选择值 if 'drop_down_1_val' not in st.session_state: st.session_state.drop_down_1_val = "Option 2" def update_dropdown_state(): # 更新Session State并触发页面重跑 st.session_state.drop_down_1_val = st.session_state.temp_dropdown st.rerun() with st.form("my_form"): text_input_1 = st.text_input("Input 1") # 第一个下拉框绑定Session State和回调函数 drop_down_1 = st.selectbox( "Dropdown 1", ["Option 1", "Option 2"], key="temp_dropdown", on_change=update_dropdown_state, index=["Option 1", "Option 2"].index(st.session_state.drop_down_1_val) ) # 根据Session State的值决定是否显示第二个下拉框 if st.session_state.drop_down_1_val == 'Option 1': drop_down_2 = st.selectbox("Dropdown 2", ["Option 3", "Option 4"]) else: drop_down_2 = None submitted = st.form_submit_button("Submit") if submitted: st.text('Form Submitted!') if drop_down_2: st.write(f"你选择了: {drop_down_1}, {drop_down_2}")
补充说明
- 方式一适合对布局要求不高的场景,实现简单,无需额外状态管理。
- 方式二更适合需要将所有组件放在表单内的场景,通过Session State跟踪选择状态,回调触发重跑实现实时更新。
内容的提问来源于stack exchange,提问作者Minura Punchihewa
相关产品推荐
相关产品推荐

