I know this is what the documentation says, but I feel like st.rerun() and escaping the dialog by pressing the top right X or esc don’t have exactly the same behavior. It’s kind of an issue for me since I have a code that is a bit slow at time. On bigger projects, I think you can really feel the difference between “rerun” and “exiting” the dialog.
import time
import streamlit as st
@st.dialog("Example dialog")
def open_dialog():
if st.button("close"):
st.rerun()
def main():
st.header("Minimal example of dialog rerun")
time.sleep(3)
if st.button("open dialog"):
open_dialog()
if __name__ == "__main__":
main()
Here is a minimal example showing the issue. Pressing the cross show no loading at all, while clicking on the close button go through the 3s sleep and prevent the user for performing any action.
edit: This also a problem if you already have a fragment to prevent recomputing something, youy effectively cannot use a dialog in conjunction with another fragment because of the full rerun constraint.
You are right, they are not exactly the same, but they can feel the same as long as the rerun is fast. However,
I have a code that is a bit slow at time.
If you cancel the dialog, nothing has changed. There is nothing new that needs three seconds to be computed. Such a rerun should be fast. If it is not, there must be room for improvement.
New to Streamlit and facing this issue. When loading the page I am loading some data which does take a little bit of time. Are you saying this load will have to be rerun each time I want to Cancel the dialog instead of using the upper right X to close it?