Hola, just passing by…
I think it meant managing your 5 second interval readings outside the Streamlit thread. Like in Best (fastest) practice to display live 2D data - #4 by andfanilo you would download the readings every 5 seconds in a separate asyncio thread (which shouldn’t block Streamlit), put them in a queue and have the Streamlit thread pull the new readings from there. That way you can still change page in between those 5 seconds.
It does not solve your ghosting problem though (I mean it might work though, since the asyncio sleep shouldn’t block the Streamlit thread, but I haven’t tried this far). I personally try to put placeholders as deeply in the tree as possible and only on single elements so the key/label of the widget manages its visibility, not empty full containers/columns (emptying entire containers of widgets, as you can see doesn’t really work out and ghosts of children of the container still persist ) and reuse widgets as much as possible, like
import streamlit as st
from streamlit_option_menu import option_menu
import random
import time
st.header("Multipage with data refresh")
page = option_menu("", ["page1", "page2"], orientation="horizontal")
placeholder = st.container()
with placeholder:
m_1 = st.empty()
m_2 = st.empty()
m_3 = st.empty()
if page == "page1":
while True:
m_1.metric(label="Page 1 Metric 1", value=random.randrange(1000, 1109))
time.sleep(1)
elif page == "page2":
while True:
m_1.metric(label="Page 2 Metric 1", value=random.randrange(2000, 2109))
m_2.metric(label="Page 2 Metric 2", value=random.randrange(2000, 2109))
m_3.metric(label="Page 2 Metric 3", value=random.randrange(2000, 2109))
time.sleep(1)
but I totally understand this can’t easily work for you if you’re trying to build containers with different structures and have to prebuild like 50 metrics/charts plus I’m not totally convinced quick changes from empty to chart to metric would work.
Haven’t read the full issues on Github to give you a better solution. If I get you a better solution (aside from H2O Wave) I’ll write it down here.
Also, st.experimental_rerun
after a time.sleep
forces a rerun and sometimes gets rid of ghosts. Sometimes (that’s a trick I used a while back)
Have a nice day,
Fanilo