Streamlit表单中基于下拉框联动更新选项的问题求助
解决Streamlit中国家与州/省份下拉框联动问题
直接上可运行的代码,核心是利用st.session_state存储选择状态,配合on_change回调实现实时联动:
import streamlit as st # 预定义国家-州/省份映射数据 country_state_map = { "中国": ["北京", "上海", "广东", "浙江"], "美国": ["加利福尼亚州", "纽约州", "得克萨斯州"], "加拿大": ["安大略省", "不列颠哥伦比亚省", "魁北克省"] } # 初始化session_state中的变量 if "selected_country" not in st.session_state: st.session_state.selected_country = None if "selected_state" not in st.session_state: st.session_state.selected_state = None # 国家选择变化后的回调函数:重置州的选择 def reset_state(): st.session_state.selected_state = None # 国家下拉框:用key绑定session_state,自动同步选择值 st.selectbox( "选择国家", options=list(country_state_map.keys()), key="selected_country", on_change=reset_state ) # 根据选中的国家动态生成州/省份选项 if st.session_state.selected_country: available_states = country_state_map[st.session_state.selected_country] st.selectbox( "选择州/省份", options=available_states, key="selected_state" ) # 提交按钮(用于最终表单提交) if st.button("提交表单"): if st.session_state.selected_country and st.session_state.selected_state: st.success(f"已选择:{st.session_state.selected_country} - {st.session_state.selected_state}") else: st.warning("请完成所有选择")
关键要点说明
- 用
key绑定session_state:给下拉框指定唯一key后,Streamlit会自动将选择值同步到st.session_state[key],无需手动在回调里赋值,这是解决状态不更新的核心。 - 回调重置州选择:国家切换时清空州的选择,避免出现旧国家的州选项残留。
- 动态渲染州下拉框:通过判断
st.session_state.selected_country的存在,实时生成对应州的选项,确保每次页面rerun时都能拿到最新选择。
常见问题排查
- 若之前用普通变量存储选择:Streamlit每次交互都会rerun整个脚本,普通变量会被重新初始化,必须用
st.session_state保留跨rerun的状态。 - 回调未生效:检查下拉框的
key是否唯一、回调函数是否正确修改st.session_state变量,避免语法错误。
内容的提问来源于stack exchange,提问作者Sheyda Zarandi
相关产品推荐
相关产品推荐

