Streamlit 多重嵌套按钮不工作

0 投票
1 回答
33 浏览
提问于 2025-04-13 21:05

我正在尝试实现一个streamlit的用户界面,里面有两个互斥的操作按钮。每个操作按钮下面还有一些嵌套的streamlit按钮。按钮的行为应该是这样的:如果我点击一个按钮,另一个按钮就应该重置。而且如果我重复点击同一个按钮,那么这个按钮的操作和嵌套按钮应该只对这个按钮可见并且可以使用。

我尝试了多种方法。我用st.session state解决了嵌套按钮的问题。但是当我在点击第一个按钮后选择第二个按钮时,第一个按钮的内容仍然存在,这让我感到意外。反过来也一样。

请帮我解决这个问题。

sideb=st.sidebar
button1 = sideb.button('Single')
if st.session_state.get('button') != True:

    st.session_state['button'] = button1 # Saved the state

if st.session_state['button'] == True:

    st.write("button1 is True")

    option=st.selectbox('Select App?',
            ('A', 'B', 'C'),index=0)

     
    st.write('You selected:', option)
    option=option.lower()
    ''''SOME CHATTING APP WITHOUT ANY BUTTON '''
button2 = sideb.button('Multiple Queries')
if st.session_state.get('button2') != True:

    st.session_state['button2'] = button2 # Saved the state

if st.session_state['button2'] == True:
    uploaded_file = st.file_uploader("Choose a file with app_name and list_of questions.", type=['xlsx'], accept_multiple_files=False)
    st.write("button2 is True")
    if uploaded_file is not None:
        stqdm.pandas()
        df=pd.read_excel(uploaded_file)
    if st.button('Generate'):
        st.write("Do your logic here")
     
        with st.spinner('Wait for it...'):
            df['Answers']=df.progress_apply(qs, axis=1)
            AgGrid(df)
        st.success('Done!')
        csv = convert_df(df)
        download2 = st.download_button(
            label="Download Answers",
            data=csv,
            file_name='Answers.csv',
            key='download-csv'
        )

1 个回答

0

我不太确定你想要的是什么,但根据我的理解,你可能想实现一种切换的效果。在Streamlit中,最简单、最干净的方法就是给按钮设置回调函数,这样在点击按钮时就可以改变会话的状态。回调函数就是在按钮被点击时会被触发的函数。

import streamlit as st

if 'button1' not in st.session_state:
    st.session_state['button1'] = False

if 'button2' not in st.session_state:
    st.session_state['button2'] = False

def switch_button1_state():
    st.session_state['button1'] = True
    st.session_state['button2'] = False

def switch_button2_state():
    st.session_state['button1'] = False
    st.session_state['button2'] = True

sideb=st.sidebar
button1 = sideb.button('Single', on_click=switch_button1_state)
button2 = sideb.button('Multiple Queries', on_click=switch_button2_state)


if st.session_state['button1'] == True:
    st.write("Single logic here")

if st.session_state['button2'] == True:
    st.write("Multiple Queries logic here")

在这里,每次你点击一个按钮时,两个按钮的状态会互相切换,这样就能控制显示一个分支,而不是同时显示两个。如果这不是你想要的结果,请提供更多的说明。

撰写回答