I use the sidebar to filter data points plotted on a map. I have several selectBoxes to filter on different columns. I would like to change the options in the selectbox according to the data remaining in the filtered dataset.
When creating the selectBox, I use a variable that is updated after the user selects a value. However, the sidebar never gets updated and the options in my sidebar do not match my actual data.
Is there a way to work around this? Re-rendering the sidebar? Deleting a component in the sidebar?
That’s a deceptively complex question! The tricky part is that you need to have one widget modify another that was instantiated earlier in the script — and vice-versa
This is not officially supported in Streamlit today but we’ve been thinking a lot about it lately. We want to come up with a simple and polished API for this use case, and that will take some time. So I’ve created a feature request here where you can follow up on our progress.
In the meantime, here’s a hacky solution that should work for you:
Now run this code, which should be similar to what you’re trying to do:
from streamlit.ScriptRequestQueue import RerunData
from streamlit.ScriptRunner import RerunException
from streamlit.server.Server import Server
import streamlit.ReportThread as ReportThread
def rerun():
"""Rerun a Streamlit app from the top!"""
widget_states = _get_widget_states()
raise RerunException(RerunData(widget_states))
def _get_widget_states():
# Hack to get the session object from Streamlit.
ctx = ReportThread.get_report_ctx()
session = None
session_infos = Server.get_current()._session_infos.values()
for session_info in session_infos:
if session_info.session._main_dg == ctx.main_dg:
session = session_info.session
if session is None:
raise RuntimeError(
"Oh noes. Couldn't get your Streamlit Session object"
'Are you doing something fancy with threads?')
# Got the session object!
return session._widget_states
ctx = ReportThread.get_report_ctx()
session = None
session_infos = Server.get_current()._session_infos.values()
for session_info in session_infos:
if session_info.session._main_dg == ctx.main_dg:
session = session_info.session
if session is None:
raise RuntimeError(
"Oh noes. Couldn't get your Streamlit Session object"
'Are you doing something fancy with threads?')
# Got the session object!
return session._widget_states