返回

在 Streamlit 中轻松实现互斥嵌套按钮:分步指南

python

在 Streamlit 中实现互斥嵌套按钮:一个全面指南

前言

在 Streamlit 中创建用户界面时,嵌套按钮是一个强大的工具。它们允许用户在不同的操作之间进行选择,而无需重新加载页面。然而,处理互斥操作(即当单击一个按钮时,其他按钮应该重置)嵌套按钮可能会很棘手。在本指南中,我们将深入探讨如何在 Streamlit 中使用 st.session_state 来实现具有嵌套按钮的互斥操作。

互斥嵌套按钮的挑战

当您在 Streamlit 中创建多个按钮时,它们的状态通常是独立的。这意味着当您单击一个按钮时,其他按钮的状态不会受到影响。这对于大多数情况来说是理想的,但对于需要互斥操作的情况,则会导致问题。

为了说明这一点,让我们考虑一个具有两个按钮的界面。一个按钮用于单一操作,另一个按钮用于多个操作。当用户单击单一操作按钮时,我们希望禁用多操作按钮。同样,当用户单击多操作按钮时,我们希望禁用单一操作按钮。

使用 st.session_state 解决方案

要解决互斥嵌套按钮的挑战,我们可以使用 Streamlit 提供的 st.session_statest.session_state 是一个用于存储会话状态的字典,它在整个会话期间持续存在,即使页面重新加载。

通过使用 st.session_state,我们可以存储每个按钮的状态。当用户单击一个按钮时,我们将其状态设置为 True,并将其他所有按钮的状态重置为 False。这确保了只有一个按钮处于活动状态,而其他按钮被禁用。

逐步指南

让我们逐步介绍如何在 Streamlit 中实现互斥嵌套按钮:

  1. 在边栏创建按钮: 使用 st.sidebar 创建一个边栏,其中包含两个按钮,一个用于单一操作,另一个用于多操作。
  2. 初始化 st.session_state 在脚本的开头,使用 if not 'button' in st.session_state:if not 'button2' in st.session_state: 语句检查每个按钮的会话状态是否存在。如果不存在,将它们初始化为 False
  3. 处理按钮点击: 在每个按钮的单击回调中,使用以下逻辑:
    • 设置单击按钮的状态为 True
    • 将其他所有按钮的状态重置为 False
    • 显示与该按钮关联的操作选项。
  4. 显示操作选项: 在每个按钮的回调中,显示与该按钮关联的操作选项。对于单一操作按钮,这可能是显示一个下拉菜单。对于多操作按钮,这可能是显示一个文件上传器和一个“生成”按钮。

完整示例

以下是完整示例代码:

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 中实现互斥嵌套按钮。通过存储每个按钮的状态,我们可以确保在单击一个按钮时,其他按钮被重置。这对于创建具有明确操作流程的用户界面至关重要。

常见问题解答

  1. 问:st.session_state 中存储的数据在会话期间是否持久?
    • 答:是的,在会话期间存储在 st.session_state 中的数据是持久的,即使页面重新加载也是如此。
  2. 问:是否可以将 st.session_state 用作全局存储?
    • 答:可以,st.session_state 可以用作全局存储,但要注意不要存储大量的数据,因为它可能会减慢性能。
  3. 问:如何清除 st.session_state 中的数据?
    • 答:要清除 st.session_state 中的数据,可以使用 st.session_state.clear() 函数。
  4. 问:是否可以使用 st.session_state 在多个用户之间共享数据?
    • 答:不可以,st.session_state 是特定于会话的,无法在多个用户之间共享数据。
  5. 问:是否可以使用其他方法实现互斥嵌套按钮?
    • 答:是的,还有其他方法可以使用,例如使用 JavaScript 或 CSS,但 st.session_state 是最简单、最直接的方法。