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

Streamlit表单点击提交后刷新丢失输入的原因及解决方法

解决Streamlit表单提交时输入内容丢失的问题

问题根源

你遇到的输入内容丢失问题,核心原因是动态生成的随机key导致组件状态无法保留:在循环创建st.text_input时,你用fx.create_guid()生成每个输入框的key,每次页面刷新(包括点击提交按钮触发的刷新)都会生成全新的GUID。Streamlit是通过组件的key来追踪状态的,key一变,就会被识别成新组件,之前输入的内容自然就丢失了。而设置默认值时,不管key怎么变,默认值会被填充,所以看起来功能正常,但这只是临时的 workaround。

解决方案

给每个st.text_input设置固定不变的key,比如直接用用户名拼接固定前缀,确保每次页面刷新时,同一个输入框的key完全一致,Streamlit就能正确保留输入状态。

修改后的代码

with st.form(key="payments"):
    st.markdown(
        "**Hi foo, please choose the month and year for which you are entering data**")

    month, year = st.columns(2)

    with month:
        selected_month = st.selectbox("Month", months)

    with year:
        selected_year = st.selectbox("Year", years)

    status, name_column, amount = st.columns(3)

    name_column.markdown("_Name_")
    amount.markdown("_Amount (ugx)_")

    input_amounts = dict()

    for name in names:
        # 用固定的key,比如name拼接前缀,避免随机生成
        amount_key = f"amount_{name}"
        
        with name_column:
            st.write(name)
            st.write("")
        with amount:
            input_amounts[name] = st.text_input(
                placeholder="ugx", label=" ", label_visibility="collapsed", disabled=False, key=amount_key)

    submitted = st.form_submit_button("Save")
    
    if submitted:
        # 打开Google Sheet的逻辑
        for name, amount_entered in input_amounts.items():
            if amount_entered.strip() != "" and int(amount_entered) > 0:
                all_values = worksheet.get_all_values()
                next_row_index = len(all_values) + 1

                # 要插入的数据
                data = [selected_month, name, amount_entered, selected_year]

                print(data)

                # 插入到下一行
                worksheet.append_row(
                    data,
                    value_input_option='user_entered',
                    insert_data_option='insert_rows',
                    table_range= # 这里补充你的table_range值
                )

额外说明

  • 去掉了原来的name_input字典,直接用input_amounts以name为key存储输入值,逻辑更简洁。
  • 确保所有表单内的组件key都稳定,是Streamlit保留表单状态的关键,不仅是输入框,下拉框等组件也一样要遵循这个原则。

内容的提问来源于stack exchange,提问作者Arnold_CK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:35:19