Spaces:
Runtime error
Runtime error
File size: 3,763 Bytes
ac6c40f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
import streamlit as st
# Streamlit widgets with persistence
# TODO: better detection of whether a field has been updated
def update_card_dict(key_list, default=None):
state_key = "_".join(key_list)
if st.session_state.save_state.get(state_key, default) != 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[state_key]
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, []),
help=help,
)
update_card_dict(key_list, default=[])
return res
def make_selectbox(key_list, label, options, format_func=lambda x: x, help="", index=None, on_change=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,
help=help,
on_change=on_change,
)
update_card_dict(key_list, default=[])
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])),
help=help,
)
update_card_dict(key_list)
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, ""),
help=help,
)
update_card_dict(key_list, default="")
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, ""),
help=help,
)
update_card_dict(key_list, default="")
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),
help=help,
)
update_card_dict(key_list)
return res
|