仅在 Streamlit 中进行昂贵的操作时禁用按钮

问题描述 投票:0回答:1
  • python 3.12.2
  • 流光1.33.0

我有一个昂贵的操作,并且想禁用一个按钮以仅在操作期间执行它。换句话说,有一个启用按钮。当您按下它时,它会被禁用并开始操作。当操作结束时,按钮再次启用。

这是我尝试过的代码。操作过程中按钮未启用。

import time

import streamlit as st
import streamlit.components.v1 as stc

def expensive_process():
    time.sleep(3)
    return 123

def main():
    st.session_state.disabled = False

    text_wait = st.empty()

    but_ph = st.empty()
    but = but_ph.button('calculate', disabled=st.session_state.disabled)

    if but:
        st.session_state.disabled = True
        text_wait.markdown('running...')

        result = expensive_process()

        st.session_state.disable = False
        text_wait.markdown(f'The result was {result}')
        
if __name__ == '__main__':
    main()

我用谷歌搜索“点击后streamlit禁用按钮”并检查了前几页。这没什么帮助。我很感激您对此事的想法。

python button streamlit isenabled
1个回答
0
投票

到目前为止,右边的它只能将启用更改为禁用。但是,我在再次启用它时遇到问题。因为,第一个问题是你不应该直接使用

st.session_state.disabled=True
,因为当你单击按钮时它会重新运行应用程序,所以你需要将
st.session_state.disabled
放在 if 语句中。因此,看起来您需要添加刷新按钮来重新运行应用程序。据我所知,只有这样一个办法。如果有其他方法,我很乐意学习。

import time 
import streamlit as st
import streamlit.components.v1 as stc

def expensive_process():
    time.sleep(3)
    return 123

def main():
    

if "disabled" in st.session_state:
    
    if st.session_state.disabled == True:
        st.session_state.disabled = False
    else:
        st.session_state.disabled = True

else:
    st.session_state.disabled = False
            
        
    text_wait = st.empty()

    but_ph = st.empty()
    
    but = but_ph.button('calculate', disabled=st.session_state.disabled)

    if but:
        text_wait.markdown('running...')

        result = expensive_process()

        text_wait.markdown(f'The result was {result}')
        
        

if __name__ == '__main__':
    main()

当我添加刷新按钮时,它可以使禁用按钮变为启用按钮。

import time

import streamlit as st
import streamlit.components.v1 as stc

def expensive_process():
    time.sleep(3)
    return 123

def main():
    
    if "disabled" in st.session_state:
        
        if st.session_state.disabled == True:
            st.session_state.disabled = False
        else:
            st.session_state.disabled = True
    
    else:
        st.session_state.disabled = False
        
    text_wait = st.empty()

    but_ph = st.empty()
    
    but = but_ph.button('calculate', disabled=st.session_state.disabled)
    refresh = st.button('refresh', disabled=False)

    if but:
        text_wait.markdown('running...')

        result = expensive_process()

        text_wait.markdown(f'The result was {result}')
        
        

if __name__ == '__main__':
    main()
© www.soinside.com 2019 - 2024. All rights reserved.