Caching functions under a button

Summary

Whenever I am selecting an attribute from selectbox, the code runs again including the code under the button. I dont want the code under the button to rerun again, what can I do? I tried implementing session state but not sure where i am making mistake. Any help would be appreciated.

Code snippet:

button=st.button("Know")
    if st.session_state.get('button') != True:
        st.session_state['button'] = button
    if st.session_state['button'] == True and username:
        try:
            with st.spinner("Fetchingโณ....."):
                tweets,lst = get_data(username,no_tweets)
                prompt, template = start_haystack(api_key,tweets)
                results = query(prompt, template)
                ans = results[0]
                st.markdown(f"<h4 style='font-family: Roboto; font-weight: normal;'>@{username} has been tweeting about:</h4>", unsafe_allow_html=True)
                st.markdown(f"<h4 style='font-family: Lato; border: 2px solid #26C3E2; padding: 15px; font-weight: normal;'>{ans}</h4>", unsafe_allow_html=True)
                st.write("")
                st.write("")
                st.markdown(f"<h3>Source Tweets:</h3>", unsafe_allow_html=True)
                for i in lst:
                    st.markdown(f"<h5 style='font-family: Chirp; font-weight: normal;'>{i}</h5>",unsafe_allow_html=True)
                    st.divider()
        except Exception as e:
                st.write(e)
                st.write("Kindly reduce the no. of tweets to summarize")


    if st.session_state['button']==True:
        keywords = get_keyword(api_key, ans)
        keys = Convert(keywords[0])
        print(keys)
        st.markdown(f"<h3>Select a topic to know more</h3>", unsafe_allow_html=True)
        box = st.selectbox("", keys)
        articles=get_latest_articles(box)
        for article in articles:
            st.write('Title:', article['title'])
            st.write('Link:', article['link'])
            st.write('Snippet:', article['snippet'])
            st.divider()
    elif button and not username:
        st.warning("Please enter a twitter handle")

@OjasMittal Hi,

You might be interested to take a look into the add-on streamlit package from Mr-Milk that saves variables with create_store() in the session state that you can retrieve with the get_state() command.

In command prompt/Anaconda Powershell Prompt to install the package you can run in your virtual environment:

pip install fire-state

In your Python script add at top you can import the module:

from fire_state import create_store, form_update, get_state, set_state, get_store, set_store
# create in session state a slot with key-value pair
create_store("MY_SLOT_NAME", [("my_btn", False)])

# define button
button = st.button("Know")

# update value in session state to value equal of button e.g. True if clicked
set_state("MY_SLOT_NAME", ("my_btn", button))

# set condition to only code run if button is not True
if get_state("MY_SLOT_NAME", "my_btn") != True:
  st.write(do not run this!)

Hope that helps! If not would you be able to create a dummy example that I can run as I do not fully understand what you are trying to accomplish as your code has dependencies not included in the code not important for solving this question.

Thanks for the information