Spaces:
Runtime error
Runtime error
import streamlit as st | |
# Streamlit widgets with persistence | |
def is_filled(key_list): | |
state_filled_key = "_".join(key_list) + "_filled" | |
def on_change_action(): | |
st.session_state.save_state[state_filled_key] = True | |
return on_change_action | |
def update_card_dict(key_list, use_default=None): | |
state_key = "_".join(key_list) | |
if st.session_state.save_state.get(state_key + "_filled", False) or use_default: | |
card_key = key_list[-1] | |
current_dict = st.session_state.card_dict | |
for key in key_list[:-1]: | |
current_dict = current_dict[key] | |
current_dict[card_key] = st.session_state.save_state.get(state_key, use_default) | |
def make_multiselect( | |
key_list, label, options, format_func=lambda x: x, help="", default=None | |
): | |
key = "_".join(key_list) | |
if key in st.session_state: | |
st.session_state.save_state[key] = st.session_state[key] | |
elif default is not None: | |
st.session_state.save_state[key] = default | |
res = st.multiselect( | |
label=label, | |
options=options, | |
format_func=format_func, | |
key=key, | |
default=st.session_state.save_state.get(key, []), | |
on_change=is_filled(key_list), | |
help=help, | |
) | |
update_card_dict(key_list) | |
return res | |
def make_selectbox( | |
key_list, label, options, format_func=lambda x: x, help="", index=None | |
): | |
key = "_".join(key_list) | |
if key in st.session_state: | |
st.session_state.save_state[key] = st.session_state[key] | |
elif index is not None: | |
st.session_state.save_state[key] = options[index] | |
res = st.selectbox( | |
label=label, | |
options=options, | |
format_func=format_func, | |
key=key, | |
index=options.index( | |
st.session_state.save_state.get(key, options[0]) | |
), # if st.session_state.save_state.get(key, options[0]) in options else 0, | |
on_change=is_filled(key_list), | |
help=help, | |
) | |
update_card_dict( | |
key_list, use_default=st.session_state.save_state.get(key, options[0]) | |
) # use the default value even without interactions | |
return res | |
def make_radio(key_list, label, options, format_func=lambda x: x, help="", index=None): | |
key = "_".join(key_list) | |
if key in st.session_state: | |
st.session_state.save_state[key] = st.session_state[key] | |
elif index is not None: | |
st.session_state.save_state[key] = options[index] | |
res = st.radio( | |
label=label, | |
options=options, | |
format_func=format_func, | |
key=key, | |
index=options.index(st.session_state.save_state.get(key, options[0])), | |
on_change=is_filled(key_list), | |
help=help, | |
) | |
update_card_dict( | |
key_list, use_default=st.session_state.save_state.get(key, options[0]) | |
) # use the default value even without interactions | |
return res | |
def make_text_input(key_list, label, help="", value=None): | |
key = "_".join(key_list) | |
if key in st.session_state: | |
st.session_state.save_state[key] = st.session_state[key] | |
elif value is not None: | |
st.session_state.save_state[key] = value | |
res = st.text_input( | |
label=label, | |
key=key, | |
value=st.session_state.save_state.get(key, ""), | |
on_change=is_filled(key_list), | |
help=help, | |
) | |
update_card_dict(key_list) | |
return res | |
def make_text_area(key_list, label, help="", value=None): | |
key = "_".join(key_list) | |
if key in st.session_state: | |
st.session_state.save_state[key] = st.session_state[key] | |
elif value is not None: | |
st.session_state.save_state[key] = value | |
res = st.text_area( | |
label=label, | |
key=key, | |
value=st.session_state.save_state.get(key, ""), | |
on_change=is_filled(key_list), | |
help=help, | |
) | |
update_card_dict(key_list) | |
return res | |
def make_checkbox(key_list, label, help="", value=None): | |
key = "_".join(key_list) | |
if key in st.session_state: | |
st.session_state.save_state[key] = st.session_state[key] | |
elif value is not None: | |
st.session_state.save_state[key] = value | |
res = st.checkbox( | |
label=label, | |
key=key, | |
value=st.session_state.save_state.get(key, False), | |
on_change=is_filled(key_list), | |
help=help, | |
) | |
update_card_dict(key_list) | |
return res | |