前提・実現したいこと
現在、特定のデータセットを読み込んで、複数の側面から可視化する
アプリをStreamlitで作成しようと考えています。(あくまで下の図はテスト的なものです)
発生している問題・エラーメッセージ
その第一歩として、下記画面のように、サイドバーで複数の機能選択できるselectboxを用意し、サイドバー内で
データセットを読み込むボタンを付けました。(ボタンを押すことで、仮で作った変数hogeを3に変更しています。)
そして、一つの機能の中でフォームを作成し、フォームの中にパラメータを設定できる
ようにしてformの中にsubmitボタンを付け、submitボタンを押すことで、
読み込んだデータセットと、設定したパラメータを利用してplotlyなどで
グラフを描画する機能を作りたいと考えています。
しかし、実際に下記のようなコードで実施してみたところ、
formのsubmitボタンを押下したタイミングで、データセットの読み込みが
初期化されてしまいます。(hogeが1に初期化されている。本当は読み込んだデータを、submitボタン押下後も保持したい。)
submitボタンを押したときに、データセットの取得した結果は残したまま、
グラフの描画のみを行う場合はどのようにすればよいか、ご教示いただけないでしょうか。
(データ取得ボタンを付けないという選択肢もあるとは思いますが、データセットは運用の都合上、
現状はとても重いExcelファイル等からの取得とせざるを得ず、ボタンを押したときだけ
読み込むような感じで、できるだけ最小頻度の読み込みとしたいです。)
該当のソースコード
Python3
1 2import streamlit as st 3from pathlib import Path 4import sys 5import numpy as np 6import pandas as pd 7import re 8 9 10def a_function(): 11 # form sample 12 with st.form('my_form_identifier'): 13 slider_val = st.slider("Form slider") 14 checkbox_val = st.checkbox("Form checkbox") 15 # st.form_submit_button('Submit to me') 16 # Every form must have a submit button. 17 submitted = st.form_submit_button("Submit") 18 19 if submitted: 20 st.write("slider", slider_val, "checkbox", checkbox_val) 21 st.write("グラフ表示(予定)") 22 # 読み込んだデータセットと、formで設定した値を使って、何らかのグラフ描画などを行いたい 23 24 # container sample 25 st.container() 26 27def b_function(): 28 # columns sample 29 col1, col2, col3 = st.columns(3) 30 with col1: 31 st.header("A cat") 32 st.image("https://static.streamlit.io/examples/cat.jpg") 33 34 with col2: 35 st.header("A dog") 36 st.image("https://static.streamlit.io/examples/dog.jpg") 37 38 with col3: 39 st.header("An owl") 40 st.image("https://static.streamlit.io/examples/owl.jpg") 41 42 43def main(): 44 st.title("ほげほげデータビューワ") 45 46 mode_list = ["a機能", "b機能"] 47 func_sel = st.sidebar.selectbox("機能を選んでください", mode_list) 48 hoge = 1 49 50 # データ取得処理 51 get_data_source = st.sidebar.button("データ取得、更新") 52 if get_data_source: 53 # 何らかのデータ取得処理を記載(ボタン押下時のみ取ってくるようにする) 54 hoge = 3 55 st.text("データ取得しました。") 56 pass 57 st.text(f"hoge:{hoge}") 58 59 if func_sel == "a機能": 60 a_function() 61 else: 62 b_function() 63 64 65if __name__ == "__main__": 66 main()
試したこと
簡単なサンプルを作り、試行錯誤した。
Streamlitのリファレンスを確認した。
補足情報(FW/ツールのバージョンなど)
Python 3.8.7
Streamlit 1.0.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/06 06:48