前提
multiselectで選択した内容を、ボタンを押すことで、ファイルから読み込んだデータで
更新する、という機能をstreamlitで実現したいと考えています。
実現したいこと
上記を実現するため、下記イメージのように、streamlitでmulti_selectの入力結果を「除外ID対象を更新」ボタンを押すことで固定値で更新するという機能を作ってみました。
(簡単化のため、シンプルにしました。実際はもう少し複雑ですが)
ボタンを押下した時の情報を保存するには、st.session_stateを使うとよいとのことでしたので、session_stateにて実現しています。
発生している問題・エラーメッセージ
エラーは特に発生しないのですが、下記問題が発生しています。
①multi_selectで選択肢を増やしたときはきちんと増加するのですが、multi_selectで、
「×」を押下してすでに追加された項目を除去した場合、きちんと除去されない
(反映されない)時があります。
②multi_selectでいくつか選択した状態(ボタンを押下で更新される内容と違う状態)で、ボタン押下した場合に、ボタン押下の内容が更新されない「ことがある」状態になります。
上記2点を解決したいのですが、原因がわからず、原因及び解決方法について
ご教示いただけましたら幸甚です。(「前提」に書かれた内容を実現したい、というのが
もともとですので、下記に示すソースコードでは実現方法として適切でない、より良い方法があるということであれば、合わせてご提示いただけましたら非常にありがたいです)
該当のソースコード
Python3
1import streamlit as st 2from pathlib import Path 3import sys 4import numpy as np 5import pandas as pd 6 7 8def main(): 9 st.title("multi_select更新テスト") 10 if "omit_list" not in st.session_state: 11 st.session_state["omit_list"] = [] 12 13 reflesh = st.button("除外ID対象を更新") 14 omit_default_list = st.session_state["omit_list"] 15 if reflesh: 16 # 本当はファイルから読み込んだデータセットで更新 17 omit_default_list = [1,2,3] 18 else: 19 # omit_default_list = st.session_state["omit_list"] 20 pass 21 22 omit_list = st.multiselect( 23 "除外するIDを選択ください", 24 [1,2,3,4], 25 default=omit_default_list, 26 key="omit_multi", 27 ) 28 st.session_state["omit_list"] = omit_list 29 30 st.text(omit_list) 31 32 33if __name__ == "__main__": 34 main()
試したこと
ネットで調べて、streamlitでの、「前提」の実現方法を検討した。
streamlit公式で、st.multi_selectの内容を確認した。
補足情報(FW/ツールのバージョンなど)
python 3.9.6
streamlit 1.1.0

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/07 22:42 編集
2022/07/08 00:01
2022/07/08 01:47
2022/07/08 03:24