Created
May 20, 2022 15:00
-
-
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)
This file contains hidden or 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
# 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}') |
Author
asehmi
commented
May 20, 2022
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment