我遇到了 Streamlit 的问题,我试图允许用户使用
st.text_input
修改文本,然后在单击按钮时显示修改后的文本。但是,修改后的文本并未按预期保留在会话状态中。
这是代码的简化版本:
import streamlit as st
# Initialize session state
if 'text' not in st.session_state:
st.session_state.text = "original"
if st.button("show"):
# Allow the user to modify the text
st.session_state.text = st.text_input("Edit Text", value=st.session_state.text)
# Display the modified text
st.markdown(st.session_state.text)
if st.button("show again"):
# Display the modified text
st.markdown(st.session_state.text)
尽管使用
st.text_input
修改文本,“再次显示”按钮仍然显示原始文本,而不是修改后的文本。我也尝试过使用 st.text_area
,但问题仍然存在。
为什么修改后的文本没有按预期保留在会话状态中?如何让它按预期持续下去?
出现此问题的原因有两点:
有两种方法可以解决此问题。
text
在会话状态下初始化的方式我们可以使用
get
,因为 st.session_state
就像一个字典(或 if-else 块)来初始化 text
键,以便在脚本重新运行时,text
值在“会话”中持续存在;如果是第一次,它的值将为 'original'
但对于后续运行,它将是前一个会话中的值。
import streamlit as st
# Initialize session state
st.session_state.text = st.session_state.get('text', 'original')
if st.button("show"):
# Allow the user to modify the text
st.text_input("Edit Text", key='text') # <--- set using the key kwarg
# Display the modified text
st.markdown(st.session_state.text)
if st.button("show again"):
# Display the modified text
st.markdown(st.session_state.text)
另一个选项是定义一个回调函数,该函数在单击按钮时激活(再次显示)。该函数使用
text
的当前值更新会话状态,以便在后续脚本重新运行时保持不变。
import streamlit as st
def update_text(value): # <--- define callback function
st.session_state.text = value
# Initialize session state
if 'text' not in st.session_state:
st.session_state.text = 'original'
if st.button("show"):
# Allow the user to modify the text
st.text_input("Edit Text", key='text')
# Display the modified text
st.markdown(st.session_state.text)
if st.button("show again", on_click=update_text, args=[st.session_state.text]): # <--- invoke the callback
# Display the modified text
st.markdown(st.session_state.text)