You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit中st.form_submit_button点击返回False无法执行任务求助

解决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("请填写所有字段")

关键修改说明

  1. 会话状态管理:用st.session_state.show_form记录表单是否显示,页面刷新后状态保留,避免表单被隐藏
  2. 表单显示逻辑:通过切换show_form的布尔值,实现"Form"按钮的显示/隐藏切换功能
  3. 类型兼容修复:原代码中age是数字类型,直接和字符串拼接会报错,改用f-string自动处理类型转换

内容的提问来源于stack exchange,提问作者RAO.sh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:10:44