Multiple sliders with dependant values

I had the exact same problem and solved it with session state. Here is the code for the four sliders:

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)