質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

10766閲覧

streamlitで、st_form_buttonで作ったボタンを押下した時に、 全体を初期化されないようにしたい

H.K2

総合スコア88

Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/11/03 04:44

前提・実現したいこと

現在、特定のデータセットを読み込んで、複数の側面から可視化する
アプリを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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ユーザがウィジットを操作するたびに、スクリプト全体が再度実行されます。このため、スクリプトのトップレベルにhoge = 1があると、その度にhogeは1に初期化されることになります。

Session State オブジェクトを用いると、ユーザ操作によるスクリプトの再実行を跨いで、値を保持できるようです。
https://docs.streamlit.io/library/api-reference/session-state

python

1def main(): 2 st.title("ほげほげデータビューワ") 3 4 mode_list = ["a機能", "b機能"] 5 func_sel = st.sidebar.selectbox("機能を選んでください", mode_list) 6        # hoge = 1 7 8 get_data_source = st.sidebar.button("データ取得、更新") 9 if get_data_source: 10 # 取得したデータは session_state オブジェクトに保存します 11 st.session_state.hoge = 3 12 st.text("データ取得しました。") 13 14 try: 15 st.text(f"hoge:{st.session_state.hoge}") 16 except AttributeError: 17 # st.session_state.hoge に値が保持されていない時のみ最初の読み込みと判断し初期化を行います 18 st.session_state.hoge = 1 19 st.text(f"hoge:{st.session_state.hoge}") 20 21 if func_sel == "a機能": 22 a_function() 23 else: 24 b_function()

投稿2021/11/04 12:34

編集2021/11/04 23:30
etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

H.K2

2021/11/06 06:48

ありがとうございます。session_stateで保持できるんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問