如何在streamlit中单击按钮后使session_state持续存在

问题描述 投票:0回答:1

我遇到了 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
,但问题仍然存在。

为什么修改后的文本没有按预期保留在会话状态中?如何让它按预期持续下去?

python button streamlit
1个回答
0
投票

出现此问题的原因有两点:

有两种方法可以解决此问题。

选项 1:更改
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)

选项2:使用回调函数

另一个选项是定义一个回调函数,该函数在单击按钮时激活(再次显示)。该函数使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.