如何制作相互交互的 streamlit 小部件以存储以前的输入?

How to make streamlit widgets that interact with each other to store previous input?

我正在尝试在 streamlit 中制作一个页面,其中我有两个多 select 小部件 select 在州和城市之间。

首先用户需要选择州,然后只有属于该州的城市才会出现在 selection 中。到目前为止,还不错。

当我已经 select 编辑了一些城市,但随后我尝试选择另一个州时,问题就出现了。当我这样做时,我的城市小部件被清除干净,然后我必须再次选择所有城市。

当用户选择其他州时,城市小部件会重置

for uf, cidade, ciclo in lista_cidades:
            if uf in uf_dict:
                uf_dict[uf].append(cidade)
            else:
                uf_dict[uf]=[cidade]
                
        st.multiselect('Selecione o estado', sorted(uf_dict), key='UF')

        for uf in st.session_state.UF:
            for city in uf_dict[uf]:
                city_list.append(city)

        st.multiselect('Selecione a cidade', sorted(city_list), key='cities')

        for city in st.session_state.cities:
            for k, v in uf_dict.items():
                if city in v:
                    st.session_state.cities_selected.append((k, city))

uf_dict 变量看起来像这样

uf_dict = {
  "AM": [
    "MANAUS",
    "ITACOATIARA"
  ],
  "GO": [
    "JATAI",
    "MINEIROS",
    "FORMOSA",
    "INHUMAS",
    "ITABERAÍ",
    "JARAGUÁ"
  ]
}

有什么方法可以保存之前select的城市,这样我就不用重新选择了?

我实际上设法找到了解决方案。

首先我创建了这个回调函数:

def callback(state, object):
    st.session_state[f'{state}'] = object

然后我使用了这个代码:

    if (
        st.button('EXECUTE', on_click=callback, args=('execute', True))
        or st.session_state.execute == True
    ):
        st.warning('Are you sure you want to execute this?')
        if st.button('YES'):
            st.write('You did it!')

当我点击'EXECUTE'按钮时,我调用回调函数,然后我可以执行另一个命令。

这是结果: