Skip to content

Instantly share code, notes, and snippets.

@asehmi
Created May 20, 2022 15:00
Show Gist options
  • Save asehmi/ccda1544ebc791339fd7dc5f056a8374 to your computer and use it in GitHub Desktop.
Save asehmi/ccda1544ebc791339fd7dc5f056a8374 to your computer and use it in GitHub Desktop.
Setting Streamlit widget values via callbacks (2 range sliders | no value overlap | clamped values)
# 2 range sliders | no value overlap | clamped values
import streamlit as st
state = st.session_state
def _set_x_cb():
if state.x[1] > state.y[0]:
state.x = (state.x[0], state.y[0])
def _set_y_cb():
if state.y[0] < state.x[1]:
state.y = (state.x[1], state.y[1])
message = st.info('')
x_slider = {'val': (5,20),'min': 0,'max': 100,'step': 1,}
y_slider = {'val': (30,50),'min': 0,'max': 100,'step': 1,}
x = st.slider(
'X',
value=x_slider['val'],
min_value=x_slider['min'],
max_value=x_slider['max'],
step=x_slider['step'],
on_change=_set_x_cb,
key='x'
)
y = st.slider(
'Y',
value=y_slider['val'],
min_value=y_slider['min'],
max_value=y_slider['max'],
step=y_slider['step'],
on_change=_set_y_cb,
key='y')
def _clamp_range(val, spec):
val_0 = spec['min'] if val[0] < spec['min'] else val[0]
val_0 = spec['max'] if val_0 > spec['max'] else val_0
val_1 = spec['min'] if val[1] < spec['min'] else val[1]
val_1 = spec['max'] if val_1 > spec['max'] else val_1
return (val_0, val_1)
def _reset_cb():
state.x = x_slider['val']
state.y = y_slider['val']
def _make_same_cb():
state.y = (state.x[1],state.x[1] + (state.x[1]-state.x[0]))
def _make_times2_cb():
state.x = (state.x[0]*2, state.x[1]*2)
state.x = _clamp_range(state.x, x_slider)
state.y = (state.y[0]*2, state.y[1]*2)
state.y = _clamp_range(state.y, y_slider)
def _make_sub2_cb():
state.x = (state.x[0]-2, state.x[1]-2)
state.x = _clamp_range(state.x, x_slider)
state.y = (state.y[0]-2, state.y[1]-2)
state.y = _clamp_range(state.y, y_slider)
c1, c2, c3, = st.columns(3)
c1.button('Join X+Y with same gap', on_click=_make_same_cb)
c2.button('Multiply by 2', on_click=_make_times2_cb)
c3.button('Subtract 2', on_click=_make_sub2_cb)
st.button('🔃', help='Reset values', on_click=_reset_cb)
message.info(f'X = {x} | Y = {y}')
@asehmi
Copy link
Author

asehmi commented May 20, 2022

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment