Skip to content

Instantly share code, notes, and snippets.

@alexlib
Created December 8, 2022 21:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexlib/276a9c10dc55d7a75676e52b4ac230df to your computer and use it in GitHub Desktop.
Save alexlib/276a9c10dc55d7a75676e52b4ac230df to your computer and use it in GitHub Desktop.
import streamlit as st
# streamlit preparation
st.title('Four dependent sliders')
# Session state callbacks
def callback_x1():
"""The callback renormalizes the values that were not updated."""
# Here, if we modify X1, we calculate the remaining value for normalisation of X2, X3 and X4
remain = 100 - st.session_state.x1
# This is the proportions of X2, X3 and X4 in remain
sum = st.session_state.x2 + st.session_state.x3 + st.session_state.x4
# This is the normalisation step
st.session_state.x2 = st.session_state.x2/sum*remain
st.session_state.x3 = st.session_state.x3/sum*remain
st.session_state.x4 = st.session_state.x4/sum*remain
def callback_x2():
remain = 100 - st.session_state.x2
sum = st.session_state.x1 + st.session_state.x3 + st.session_state.x4
st.session_state.x1 = st.session_state.x1/sum*remain
st.session_state.x3 = st.session_state.x3/sum*remain
st.session_state.x4 = st.session_state.x4/sum*remain
def callback_x3():
remain = 100 - st.session_state.x3
sum = st.session_state.x1 + st.session_state.x2 + st.session_state.x4
st.session_state.x1 = st.session_state.x1/sum*remain
st.session_state.x2 = st.session_state.x2/sum*remain
st.session_state.x4 = st.session_state.x4/sum*remain
def callback_x4():
remain = 100 - st.session_state.x4
sum = st.session_state.x1 + st.session_state.x2 + st.session_state.x3
st.session_state.x1 = st.session_state.x1/sum*remain
st.session_state.x2 = st.session_state.x2/sum*remain
st.session_state.x3 = st.session_state.x3/sum*remain
# Sessions tate initialise
# Check if 'key' already exists in session_state
# If not, then initialize it
if 'x1' not in st.session_state:
st.session_state['x1'] = 50.0
if 'x2' not in st.session_state:
st.session_state['x2'] = 25.0
if 'x3' not in st.session_state:
st.session_state['x3'] = 12.5
if 'x4' not in st.session_state:
st.session_state['x4'] = 12.5
# The four sliders
st.slider("x1 value, %",
min_value = 0.0,
max_value = 100.0,
key='x1', on_change=callback_x1)
st.slider("x2 value, %",
min_value = 0.0,
max_value = 100.0,
key='x2', on_change=callback_x2)
st.slider("x3 value, %",
min_value = 0.0,
max_value = 100.0,
key='x3', on_change=callback_x3)
st.slider("x4 value, %",
min_value = 0.0,
max_value = 100.0,
key='x4', on_change=callback_x4)
# Print things to check
st.write(st.session_state.x1 + st.session_state.x2 + st.session_state.x3 + st.session_state.x4)
st.write(st.session_state.x1)
st.write(st.session_state.x2)
st.write(st.session_state.x3)
st.write(st.session_state.x4)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment