Streamlit automatically refreshes if a checkbox is ticked

Hey guys ,
I’m working on a sentiment analysis application with streamlit which includes checkboxes for user input to select an option , but if the user clicks on a checkbox the page refreshes and the result is not displayed on the screen. I have attached the code snippet to invoke the function for sentiment analysis which is implemented, I have also tried printing a string when the checkbox is ticked , but unfortunately that doesn’t work too.

sentiment_tab= st.checkbox("sentiment analysis")
if sentiment_tab:
            print('db2')
            st.subheader("Sentiment Analysis")
            sentiment = sentiment_analysis(article_choice)
            st.write(sentiment)

The code works with my own implementation of sentiment_analysis. The problem must be in your sentiment_analysis.

Hey,
I checked the sentiment analysis code out but there is nothing that does this , I also tried the same logic with a selectbox , it works for the first choice but as soon as the second choice is clicked it does the same

also tried it with a button, if I click on the button it doesn’t change it’s state to true

I stick to my previous assessment. Unfortunately I don’t have your implementation of sentiment_analysis so I cannot be of much help.

The logic in the code you posted is correct as far as I can tell: when the checkbox is checked it will call sentiment_analysis(article_choice) and then write the return value.

This is the function to obtain the sentiment of a particular sentence

def sentiment_analysis(text):
    sentiments = []
    
    from nltk.sentiment import SentimentIntensityAnalyzer
    sia = SentimentIntensityAnalyzer()
    sentiment = sia.polarity_scores(text)
    sentiments.append(sentiment)
    for sentiment in sentiments:
        return sentiment

This is how I display the sentiments

# Collect RSS feed URLs and keywords using the menu bar
    rss_feeds = collect_rss_feeds()
    keywords = collect_keywords()
    fetch_btn= btn_holder.button("Fetch articles")
    if fetch_btn :
        # Parse RSS feeds and extract articles
        count=0
        print(count)
        st.write("Articles containing keywords:")
        articles = []
        for rss_feed in rss_feeds:
            parsed_feed = feedparser.parse(rss_feed)
            for entry in parsed_feed.entries:
                articles.append(entry.summary)

        # Search for keywords in articles
        keyword_articles = []
        for keyword in keywords:
            for article in articles:
                if keyword in article:
                    keyword_articles.append(article)
        
        
        article_choice= st.selectbox("select", keyword_articles) 

        if article_choice:
            summarization_tab,sentiment_tab,wordcloud_tab= st.tabs(["Summarization", "Sentiment Analysis", "Word Cloud"])
            with sentiment_tab:
                st.subheader("Sentiment Analysis")
                sentiment = sentiment_analysis(article_choice)
                st.write(sentiment)

I ran your original code with this implementation of sentiment_analysis() and article_choice = "What's up, doc?" and got this when checked the checkbox:

{
    "neg":0
    "neu":1
    "pos":0
    "compound":0
}

the code that I have attached below also shows the same behaviour

import streamlit as st

def sentiment_analysis(text):
    sentiment=[]
    from nltk.sentiment import SentimentIntensityAnalyzer 
    sia= SentimentIntensityAnalyzer()
    sentiment.append(sia.polarity_scores(text=text))
    for sentiment in sentiment:
        return sentiment

sentences= st.sidebar.text_input("enter some text seperated by commas")
sen= sentences.split(',')

if st.button("submit"):


   
    st.subheader("Sentiment analysis")

    choice=st.selectbox("sent", sen)


    if choice != None:
        print(choice)
        sentiment= sentiment_analysis(text= choice)
        st.write(sentiment)


    

The issue here is that when you change the choice in the selectbox, the app reruns. In the next run the submit button returns False and the code under the if does not run. So you can only see the polarity scores of the first sentence, but once you select another sentence the subheader, the selectbox and the scores dissapear.

To avoid this do the following:

  • Under the if clause, compute the values that you know you will need and store them in st.session_state. In this example you only need the list of sentences sen, in your actual code the list of articles keyword_articles.
  • Move the rest of the code outside the if so that it runs no matter if you pressed the button or not. Get the values that you need from st.session_state.

If you do just that, you will get a KeyError when you start a session because the values you need in st.session_state won’t be there yet. But if you write some sentences in the text_input and press the Submit button, you will be able to see the scores for each sentence.

In order to get rid of the KeyError, check if st.session_state has the values that you need before running the last part of the code.

import streamlit as st


def sentiment_analysis(text):
    sentiment = []
    from nltk.sentiment import SentimentIntensityAnalyzer

    sia = SentimentIntensityAnalyzer()
    sentiment.append(sia.polarity_scores(text=text))
    for sentiment in sentiment:
        return sentiment


sentences = st.sidebar.text_input("enter some text seperated by commas")

if st.button("submit"):
    st.session_state["sen"] = sentences.split(",")

if "sen" not in st.session_state:
    st.stop()

st.subheader("Sentiment analysis")

choice = st.selectbox("sent", st.session_state["sen"])

if choice != None:
    print(choice)
    sentiment = sentiment_analysis(text=choice)
    st.write(sentiment)