提交问题后清空Streamlit输入框遇StreamlitAPIException报错求助
解决Streamlit提交后清空输入框的报错问题
你遇到的StreamlitAPIException是因为在st.text_input组件实例化完成后,直接修改了它对应的session_state键值。Streamlit的渲染规则要求,组件关联的session_state修改操作必须在组件创建之前执行,否则会触发该异常。
方案一:使用表单提交回调函数
通过给表单的提交按钮绑定on_click回调,在回调里处理输入并清空session_state,再触发页面重跑更新输入框:
def handle_submit(): # 处理用户输入 if st.session_state.get("temp_user_question"): user_input(st.session_state["temp_user_question"]) # 清空输入框对应的session_state值 st.session_state["temp_user_question"] = "" # 触发页面重跑,让输入框读取新的session_state值 st.experimental_rerun() def main(): st.set_page_config(page_title="ChatBot") st.header("ChatBot") # 初始化session_state键(防止首次运行报错) if "temp_user_question" not in st.session_state: st.session_state["temp_user_question"] = "" with st.form(key='user_input_form'): user_question = st.text_input("Ask a Question", key="temp_user_question") # 绑定提交回调到按钮 submit_button = st.form_submit_button(label='Submit', on_click=handle_submit)
方案二:在组件渲染前处理清空逻辑
把提交后的清空逻辑放在st.text_input组件创建之前,确保修改session_state时组件还未实例化:
def main(): st.set_page_config(page_title="ChatBot") st.header("ChatBot") # 初始化必要的session_state键 if "temp_user_question" not in st.session_state: st.session_state["temp_user_question"] = "" if "submitted" not in st.session_state: st.session_state["submitted"] = False # 提交后的处理逻辑,放在组件渲染之前 if st.session_state["submitted"]: if st.session_state["temp_user_question"]: user_input(st.session_state["temp_user_question"]) # 清空输入并重置提交状态 st.session_state["temp_user_question"] = "" st.session_state["submitted"] = False # 重跑页面更新输入框 st.experimental_rerun() with st.form(key='user_input_form'): user_question = st.text_input("Ask a Question", key="temp_user_question") submit_button = st.form_submit_button(label='Submit') if submit_button: # 标记提交状态 st.session_state["submitted"] = True
你之前的两种实现都是在表单内部、st.text_input已经渲染完成后修改session_state["temp_user_question"],违反了Streamlit的组件渲染规则,所以触发了异常。上面的两种方案都避开了这个问题,能正常实现提交后清空输入框的功能。
内容的提问来源于stack exchange,提问作者MUHAMMAD KASHIF
相关产品推荐
相关产品推荐

