One button to create and download a file

Hi there,

I would like to have a button that creates a file and then downloads that file in one click.

I couldn’t figure out how to do that, so right now I have two buttons to do this (one to create the file and one to download it). Can someone please explain how this can be done in one button?

This is my code with two buttons:

but_html= st.button('create html-file')   #first button

if but_html:
   with st.spinner('creating html-file...'):
      f_pn= 'export/interactive.html'     # the file that's going to be created      
      fuan.html_exp(f_pn)                 # function that creates the file
    
      with open(f_pn, 'rb') as exfile:
         st.download_button(              #second button
            label="download html-file",
            data=exfile,
            file_name=f_pn.split('/')[-1],
            mime='application/xhtml+xml',
         )

It works, but I always have to tell the user, that they need to click the download button after creating the file… it’s not intuitive and confuses a lot of people. I’m sure there is a better way to do this…