我有一个昂贵的操作,并且想禁用一个按钮以仅在操作期间执行它。换句话说,有一个启用按钮。当您按下它时,它会被禁用并开始操作。当操作结束时,按钮再次启用。
这是我尝试过的代码。操作过程中按钮未启用。
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禁用按钮”并检查了前几页。这没什么帮助。我很感激您对此事的想法。
到目前为止,右边的它只能将启用更改为禁用。但是,我在再次启用它时遇到问题。因为,第一个问题是你不应该直接使用
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()