在 Streamlit 中轻松实现互斥嵌套按钮:分步指南
2024-03-16 22:43:34
在 Streamlit 中实现互斥嵌套按钮:一个全面指南
前言
在 Streamlit 中创建用户界面时,嵌套按钮是一个强大的工具。它们允许用户在不同的操作之间进行选择,而无需重新加载页面。然而,处理互斥操作(即当单击一个按钮时,其他按钮应该重置)嵌套按钮可能会很棘手。在本指南中,我们将深入探讨如何在 Streamlit 中使用 st.session_state
来实现具有嵌套按钮的互斥操作。
互斥嵌套按钮的挑战
当您在 Streamlit 中创建多个按钮时,它们的状态通常是独立的。这意味着当您单击一个按钮时,其他按钮的状态不会受到影响。这对于大多数情况来说是理想的,但对于需要互斥操作的情况,则会导致问题。
为了说明这一点,让我们考虑一个具有两个按钮的界面。一个按钮用于单一操作,另一个按钮用于多个操作。当用户单击单一操作按钮时,我们希望禁用多操作按钮。同样,当用户单击多操作按钮时,我们希望禁用单一操作按钮。
使用 st.session_state
解决方案
要解决互斥嵌套按钮的挑战,我们可以使用 Streamlit 提供的 st.session_state
。st.session_state
是一个用于存储会话状态的字典,它在整个会话期间持续存在,即使页面重新加载。
通过使用 st.session_state
,我们可以存储每个按钮的状态。当用户单击一个按钮时,我们将其状态设置为 True
,并将其他所有按钮的状态重置为 False
。这确保了只有一个按钮处于活动状态,而其他按钮被禁用。
逐步指南
让我们逐步介绍如何在 Streamlit 中实现互斥嵌套按钮:
- 在边栏创建按钮: 使用
st.sidebar
创建一个边栏,其中包含两个按钮,一个用于单一操作,另一个用于多操作。 - 初始化
st.session_state
: 在脚本的开头,使用if not 'button' in st.session_state:
和if not 'button2' in st.session_state:
语句检查每个按钮的会话状态是否存在。如果不存在,将它们初始化为False
。 - 处理按钮点击: 在每个按钮的单击回调中,使用以下逻辑:
- 设置单击按钮的状态为
True
。 - 将其他所有按钮的状态重置为
False
。 - 显示与该按钮关联的操作选项。
- 设置单击按钮的状态为
- 显示操作选项: 在每个按钮的回调中,显示与该按钮关联的操作选项。对于单一操作按钮,这可能是显示一个下拉菜单。对于多操作按钮,这可能是显示一个文件上传器和一个“生成”按钮。
完整示例
以下是完整示例代码:
import streamlit as st
import pandas as pd
import stqdm
from st_aggrid import AgGrid
# Create a sidebar for buttons
sideb = st.sidebar
# Create two buttons, one for single operation and one for multiple operations
button1 = sideb.button('Single')
button2 = sideb.button('Multiple Queries')
# Initialize session state for button states
if 'button' not in st.session_state:
st.session_state['button'] = False
if 'button2' not in st.session_state:
st.session_state['button2'] = False
# Single operation button
if button1:
# Set button state to True
st.session_state['button'] = True
# Reset button2 state
st.session_state['button2'] = False
# Display single operation options
option = st.selectbox('Select App?', ('A', 'B', 'C'), index=0)
st.write('You selected:', option)
# Multiple operations button
if button2:
# Set button state to True
st.session_state['button2'] = True
# Reset button state
st.session_state['button'] = False
# Display multiple operations options
uploaded_file = st.file_uploader("Choose a file with app_name and list_of questions.", type=['xlsx'], accept_multiple_files=False)
if uploaded_file is not None:
df = pd.read_excel(uploaded_file)
if st.button('Generate'):
df['Answers'] = df.progress_apply(qs, axis=1)
AgGrid(df)
st.success('Done!')
csv = convert_df(df)
st.download_button(
label="Download Answers",
data=csv,
file_name='Answers.csv',
key='download-csv'
)
结论
使用 st.session_state
,我们可以轻松地在 Streamlit 中实现互斥嵌套按钮。通过存储每个按钮的状态,我们可以确保在单击一个按钮时,其他按钮被重置。这对于创建具有明确操作流程的用户界面至关重要。
常见问题解答
- 问:
st.session_state
中存储的数据在会话期间是否持久?- 答:是的,在会话期间存储在
st.session_state
中的数据是持久的,即使页面重新加载也是如此。
- 答:是的,在会话期间存储在
- 问:是否可以将
st.session_state
用作全局存储?- 答:可以,
st.session_state
可以用作全局存储,但要注意不要存储大量的数据,因为它可能会减慢性能。
- 答:可以,
- 问:如何清除
st.session_state
中的数据?- 答:要清除
st.session_state
中的数据,可以使用st.session_state.clear()
函数。
- 答:要清除
- 问:是否可以使用
st.session_state
在多个用户之间共享数据?- 答:不可以,
st.session_state
是特定于会话的,无法在多个用户之间共享数据。
- 答:不可以,
- 问:是否可以使用其他方法实现互斥嵌套按钮?
- 答:是的,还有其他方法可以使用,例如使用 JavaScript 或 CSS,但
st.session_state
是最简单、最直接的方法。
- 答:是的,还有其他方法可以使用,例如使用 JavaScript 或 CSS,但