Created
April 8, 2024 07:56
-
-
Save andfanilo/f9362aa5de5d2e06233e96349970b9ae to your computer and use it in GitHub Desktop.
Playing with Streamlit Fragments (v1.33) - Timer + Counter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import streamlit as st | |
##### Initialize Session State | |
if "counter" not in st.session_state: | |
st.session_state.counter = 0 | |
if "timer" not in st.session_state: | |
st.session_state.timer = 0 | |
##### Build Logic into Fragments | |
@st.experimental_fragment | |
def counter_widget( | |
increment_button_placeholder, | |
decrement_button_placeholder, | |
display_counter_placeholder, | |
): | |
if increment_button_placeholder.button("β Increment"): | |
st.session_state.counter += 1 | |
if decrement_button_placeholder.button("β Decrement"): | |
st.session_state.counter -= 1 | |
display_counter_placeholder.metric("π’ Counter", st.session_state.counter) | |
@st.experimental_fragment(run_every="1s") | |
def display_timer(timer_placeholder): | |
st.session_state.timer += 1 | |
timer_placeholder.metric(f"β³ Timer", st.session_state.timer) | |
@st.experimental_fragment | |
def display_state(container_placeholder): | |
left_top, right_top = container_placeholder.columns(2) | |
left_bottom, right_bottom = container_placeholder.columns([3, 1]) | |
if left_bottom.button( | |
"π Update Display", type="primary", use_container_width=True | |
): | |
st.rerun() | |
if right_bottom.button("β Reset timer", use_container_width=True): | |
st.session_state.timer = 0 | |
st.rerun() | |
left_top.subheader(f"Current Counter: {st.session_state.counter}") | |
right_top.subheader(f"Current Timer: {st.session_state.timer}") | |
##### Build Placeholders | |
st.title("Independent states & fragments") | |
left_col, right_col = st.columns(2) | |
left_incr, right_incr = left_col.columns(2) | |
left_counter, right_timer = right_col.columns(2) | |
increment_placeholder = left_incr.empty() | |
decrement_placeholder = right_incr.empty() | |
counter_placeholder = left_counter.empty() | |
timer_placeholder = right_timer.empty() | |
main_display_placeholder = st.container(border=True) | |
##### Link Fragments to Placeholders | |
counter_widget(increment_placeholder, decrement_placeholder, counter_placeholder) | |
display_timer(timer_placeholder) | |
display_state(main_display_placeholder) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment