Streamlit

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

917閲覧

セレクトボックスとリストを対応させ、カラーピッカーで色を割り当てたい

nkfrom_asu

総合スコア10

Streamlit

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/10/26 04:10

編集2022/10/26 04:14

解決したいこと

セレクトボックスとリストを対応させ、
(R, G, B = colorList[0], colorList[1], colorList[2])
カラーピッカーで色を割り当てたいです。
(colorList = ["#ff0000", "#00ff00", "#0000ff"])

以下が試したコードです。

python

1import streamlit as st 2 3# https://github.com/streamlit/streamlit/issues/1076 4options = "RGB" 5index = st.selectbox( 6 "selectbox", 7 range(len(options)), 8 format_func=lambda x: options[x] 9 ) 10 11if "colorList" not in st.session_state: 12 st.session_state.colorList = ["#000000" for _ in range(3)] 13 14color = st.color_picker( 15 "color_picker", 16 st.session_state.colorList[index] 17 ) 18 19st.session_state.colorList[index] = color

コメントアウトしたサイトを参考にインデックスを取得

st.session_state でリスト colorList を作成

カラーピッカーで選択した色をリストに割り当て

というような感じなのですが、うまくいきません。
原因、直す部分を教えてください。よろしくお願いします。

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

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

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

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

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

bsdfan

2022/10/26 08:10

これだけだと、どううまくいかないのかがわからないので、アドバイスが難しいです。
nkfrom_asu

2022/10/27 05:14 編集

セレクトボックスが R のときにカラーピッカーで色を選択後、セレクトボックスを B にすると、R で選択した色が B にも適用されてしまいます。 B にする前にもう一度カラーピッカーを開き、そのまま閉じると正常に動作します。
guest

回答1

0

ベストアンサー

streamlitでは、何かアクションをするたびに、スクリプトの先頭から最後までが実行されます。
なので、color_pickerを操作したときだけでなくselectboxを変更したときにも、最後のst.session_state.colorList[index] = colorが実行されることになり、

セレクトボックスが R の時にカラーピッカーで色を選択後、セレクトボックスを B にすると、R で選択した色が B にも適用されてしまいます。

ということが起こります。
カラーピッカーで色を選択したときだけ、session_stateのリストを更新したいということなら、color_pickerにコールバックをセットして、その中でリストを更新するようにすればいいです。

B にする前にもう一度カラーピッカーを開くと正常に動作します。

これは、color_pickerの初期値(第2引数)が変更されたかどうかに寄っていそうです。
初期値の変更で制御するのは動作がわかりにくくなるので、session_stateを使って変更するほうがいいと思います。

python

1import streamlit as st 2 3# https://github.com/streamlit/streamlit/issues/1076 4options = "RGB" 5index = st.selectbox( 6 "selectbox", 7 range(len(options)), 8 format_func=lambda x: options[x] 9 ) 10 11if "colorList" not in st.session_state: 12 st.session_state.colorList = ["#000000" for _ in range(3)] 13 14# color_pickerを変更したときのコールバック 15def set_colorList(): 16 st.session_state.colorList[index] = st.session_state.color_picker_01 17 18# color_pickerの初期値の設定 19st.session_state.color_picker_01 = st.session_state.colorList[index] 20 21st.color_picker( 22 "color_picker", 23 key='color_picker_01', 24 on_change=set_colorList 25 )

投稿2022/10/27 08:11

bsdfan

総合スコア4925

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

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

nkfrom_asu

2022/10/28 14:25

確かに session_state を使って管理すると動作が明快になりますね。 Streamlit の扱いを少し理解できた気がします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問