How to Refresh Radio Button Options

I have an app that used st.radio in a sidebar for navigation. It’s all working fine, but I want to dynamically change the radio button options.

I’ve tried session state.
I’ve tried setting a key for st.radio.

So far the only thing that works is a manual browser refresh.

Please point me in the right direction.

Python 3.9
Streamlit 1.28.2

Can you post a reproducible piece of code of what you have tried already?

Thanks

Thanks @CarlosSerrano. Here’s the code snippet.

When the user clicks the Add New File button, it adds the new item to the list in session state. But, it does not display in st.radio.

If the user selects any other st.radio option, the added value shows up.

My question is how to refresh st.radio so new data is immediately displayed when a new item is added. Either how to do a refresh or how to better use Streamlit.

import streamlit as st

if 'file_names' not in st.session_state:
    st.session_state.file_names = ['None', 'a', 'b', 'c']

with st.sidebar:
    nav_radio = st.radio(
        "Pick a File",
        st.session_state.file_names,
        key='nav_list'
    )

    st.divider()

    if st.button("Add New File", type='primary'):
        st.session_state.file_names.append('d')


with st.container():
    st.title('File Information')
    st.divider()
    if nav_radio != 'None':
        st.markdown(f'# {nav_radio}')

@cbishop

This is a matter of using callbacks instead of if button. Here is your code modified.

import streamlit as st


def add_new():
    st.session_state.file_names.append("d")


if "file_names" not in st.session_state:
    st.session_state.file_names = ["None", "a", "b", "c"]

with st.sidebar:
    nav_radio = st.radio("Pick a File", st.session_state.file_names, key="nav_list")

    st.divider()

    st.button("Add New File", type="primary", on_click=add_new)


with st.container():
    st.title("File Information")
    st.divider()
    if nav_radio != "None":
        st.markdown(f"# {nav_radio}")

Thanks again, Carlos. I’m actually using st.file_upload to add the new item. I assume it would work the same way.

I’ll investigate callbacks.

Yes, The idea is using the callbacks as the callback function gets executed first, then the rerun happens.

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.