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
相关产品推荐
相关产品推荐

