如何在Streamlit中动态更新Selectbox的选项值?
在Streamlit中动态更新Selectbox选项的正确方法
你的代码无法正常运行的核心问题在于:
- 直接使用
while循环+time.sleep会阻塞Streamlit的运行流程,导致页面无法渲染和触发刷新 - 每次脚本重跑时都会重新初始化
st.session_state['choice'],覆盖掉更新后的值
针对你每小时更新一次选项的实际需求,推荐使用定时自动刷新的方式实现,以下是修正后的代码:
import streamlit as st def main(): # 初始化session_state,仅在首次运行时设置初始选项 if 'choice' not in st.session_state: st.session_state['choice'] = list(range(2)) # 设置自动刷新间隔,这里设为3600秒(1小时),测试时可改为5秒 st.autorefresh(interval=3600 * 1000, key="auto_refresh") # 模拟获取新数据的逻辑,替换成你实际的数据源获取代码即可 # 每次页面刷新时,更新选项列表 st.session_state['choice'] = list(range(5)) # 渲染Selectbox,自动读取session_state中的最新选项 selected_option = st.selectbox("选择选项", options=st.session_state['choice']) st.write(f"当前选中:{selected_option}") if __name__ == "__main__": main()
关键说明:
- Session State初始化:通过
if 'choice' not in st.session_state判断,避免每次页面重跑都重置选项值 - 自动刷新机制:
st.autorefresh会定时触发页面重跑,重跑时执行新数据获取逻辑,更新选项列表 - 动态渲染:Selectbox会自动读取
st.session_state['choice']的最新值,实现选项动态更新
如果你需要手动触发更新(而非定时),可以用按钮+重跑的方式:
import streamlit as st def main(): if 'choice' not in st.session_state: st.session_state['choice'] = list(range(2)) # 点击按钮手动更新选项 if st.button("更新选项"): st.session_state['choice'] = list(range(5)) st.experimental_rerun() # 触发页面重跑,立即显示新选项 st.selectbox("选择选项", options=st.session_state['choice']) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者tandem
相关产品推荐
相关产品推荐

