Streamlit中提交问题后如何清空text_input输入框
Streamlit中提交问题后如何清空text_input输入框
我太懂你这种困扰了——用Streamlit做聊天类应用时,提交完问题输入框还留着内容,确实影响体验。其实核心就是用Streamlit的session_state来绑定输入框的值,提交后重置这个值就行,我来帮你改改代码:
首先,你需要把输入框的值和session_state变量绑定,这样就能手动控制它的内容。修改你的main()函数,同时调整一下输入框的定义:
修改后的完整代码示例
def handle_userinput(user_question): if not st.session_state.conversation: st.warning("Index not ready. Please wait a moment and try again.") return preface = "You are a helpful assistant: " bot_question = preface + user_question response = st.session_state.conversation({'question': bot_question}) st.session_state.chat_history = response['chat_history'] for i, message in enumerate(st.session_state.chat_history): if i % 2 == 0: # User's message # Display only the original user's question without preface st.write(user_template.replace("{{MSG}}", user_question), unsafe_allow_html=True) else: # Bot's response st.write(bot_template.replace("{{MSG}}", message.content), unsafe_allow_html=True) def main(): # 初始化session_state中的输入变量 if 'user_input' not in st.session_state: st.session_state.user_input = "" # 将输入框的值绑定到session_state.user_input,同时设置唯一key user_question = st.text_input( "Ask a question:", value=st.session_state.user_input, key="chat_input_box" ) if user_question: handle_userinput(user_question) # 提交后清空session_state里的输入值,输入框就会同步清空 st.session_state.user_input = "" if __name__ == "__main__": main()
关键修改点说明
- 初始化session_state变量:在main函数开头先检查
user_input是否在session_state里,没有的话设为空字符串,确保每次加载都有初始值。 - 绑定输入框的value:把
st.text_input的value参数设为st.session_state.user_input,这样输入框的内容就由这个变量控制。 - 提交后重置值:当用户提交问题(
user_question不为空),处理完请求后,直接把st.session_state.user_input设为空,Streamlit重新渲染时输入框就会显示为空了。 - 添加唯一key:给输入框加个
key参数(比如chat_input_box),确保Streamlit能正确跟踪这个组件的状态,避免出现奇怪的渲染问题。
这样改完之后,你提交问题后输入框就会自动清空啦,亲测有效~
备注:内容来源于stack exchange,提问作者starskiin3d
相关产品推荐
相关产品推荐

