Streamlit中st.form_submit_button点击返回False无法执行任务求助
问题根源
你把表单放在了st.button("Form")的判断块内,Streamlit的运行机制是每次用户交互都会重新执行整个脚本:
- 第一次点击"Form"按钮时,
st.button("Form")返回True,表单被渲染出来 - 点击表单内的"Register"提交按钮时,页面刷新,此时
st.button("Form")会重置为False,整个表单代码块不再执行,导致submit_form始终是False,无法触发提交逻辑
修复方案
使用st.session_state存储表单的显示状态,确保页面刷新后状态不会丢失,从而让表单持续渲染,提交按钮能正常工作。
修改后的代码
# 初始化会话状态,控制表单显示/隐藏 if "show_form" not in st.session_state: st.session_state.show_form = False # 点击按钮切换表单显示状态 if st.button("Form"): st.session_state.show_form = not st.session_state.show_form # 根据会话状态渲染表单 if st.session_state.show_form: st.subheader("User Info Form") with st.form(key='user_info'): st.write('User Information') name = st.text_input(label="Name 📛") age = st.number_input(label="Age 🔢") email = st.text_input(label="Email 📧") phone = st.text_input(label="Phone 📱") gender = st.radio("Gender 🧑", ("Male", "Female", "Prefer Not To Say")) submit_form = st.form_submit_button(label="Register", help="Click to register!") if submit_form: # 检查所有字段是否填写完整 if name and age and email and phone and gender: # 注意:age是数字类型,需转为字符串再拼接,这里用f-string更简洁安全 st.success(f"{id}\n{age}\n{email}\n{phone}\n{gender}") # 调用你的数据库存储函数 # add_user_info(id, name, age, email, phone, gender) else: st.warning("请填写所有字段")
关键修改说明
- 会话状态管理:用
st.session_state.show_form记录表单是否显示,页面刷新后状态保留,避免表单被隐藏 - 表单显示逻辑:通过切换
show_form的布尔值,实现"Form"按钮的显示/隐藏切换功能 - 类型兼容修复:原代码中
age是数字类型,直接和字符串拼接会报错,改用f-string自动处理类型转换
内容的提问来源于stack exchange,提问作者RAO.sh
相关产品推荐
相关产品推荐

