本篇旨在測試使用者輸入元件之多選下拉式選單 st.multiselect(), 此元件的功能與核取方塊一樣, 可同時選擇多個選項.
呼叫 Streamlit 的 multselect() 函式並傳入 label 與 options 參數會建立一個多選下拉式選單, 預設會顯示第一個項目, 點選某一項目後會傳回該項目值, 其參數結構如下 :
st.multiselect(label, options, default=None, format_func=str, key=None, help=None, on_change=None, args=None, kwargs=None, disabled=False, label_visibility="visible", max_selections=None, placeholder=None)
參數說明如下表 :
| st.multiselect() 之參數 | 說明 |
|---|---|
| label | 顯示在 multiselect 上方的標籤。 |
| options | 可供選取的選項,為 list、tuple 或其他可迭代物件。 |
| default | 預設被選取的項目,型別與 options 相容,可為單一項目或多項目。 |
| format_func | 格式化選項顯示文字的函式,預設為 str。 |
| key | 為此 widget 指定唯一的 key 值,用於狀態儲存。 |
| help | 滑鼠懸停在元件時顯示的說明文字。 |
| on_change | 當選項變更時觸發的回呼函式。 |
| args | 傳遞給 on_change 的位置參數(tuple)。 |
| kwargs | 傳遞給 on_change 的關鍵字參數(dict)。 |
| disabled | 是否停用該 widget,預設為 False。 |
| label_visibility | 控制 label 顯示方式,選項有 "visible"(預設)、"hidden"、"collapsed"。 |
| max_selections | 限制使用者最多可選幾個項目。 |
| placeholder | 當尚未選取任何項目時的提示文字。 |
除了增加了 default 與 max_selections 參數外, 其餘與 st.selectbox() 的參數用法相同. st.multiselect() 的傳回值是被選取選項組成的串列, 如果未選取任何選項則傳回空串列.
測試 1 : 只傳入必要參數 label 與 options 的 [看原始碼]
# st-multiselect-test-1.py
import streamlit as st
label='請選擇擅長的程式語言 : '
options=['Python', 'C++', 'Java', 'Javascript', 'PHP', 'Rust']
selected_items=st.multiselect(label, options) # 傳回串列
st.write("你選的是:", selected_items)
初始化時因沒有選取任何選項, 所以傳回空串列 :
選取選項時會被放入上方框內, 傳回的串列會以 JSON 格式顯示 :
可見初始化時選單上顯示預設的 "Choose an option", 這可以用 placeholder 來設定, 例如 :
測試 2 : 用 placeholder 參數設定選單預設佔位文字 [看原始碼]
# st-multiselect-test-2.py
import streamlit as st
label='請選擇擅長的程式語言 : '
options=['Python', 'C++', 'Java', 'Javascript', 'PHP', 'Rust']
placeholder='請選取選項 (可多選)'
selected_items=st.multiselect(label, options, placeholder=placeholder) # 傳回串列
st.write("你選的是:", selected_items)
結果如下 :
可以用 default 參數設定預先被選取選項, 此參數值為一串列, 例如 :
測試 3 : 用 default 參數設定預先選取之選項 [看原始碼]
# st-multiselect-test-3.py
import streamlit as st
label='請選擇擅長的程式語言 : '
options=['Python', 'C++', 'Java', 'Javascript', 'PHP', 'Rust']
default=['Python', 'Javascript']
selected_items=st.multiselect(label, options, default=default) # 傳回串列
st.write("你選的是:", selected_items)
此例 default 預先選取了 Python 與 Javascript, 初始化後尚未手動選取就已經有這兩項了 :
下列範例測試 on_change 與 args 參數 :
測試 4 : 利用 args 傳送引數給 on_change 事件處理函式 [看原始碼]
# st-multiselect-test-4.py
import streamlit as st
def on_multiselect_change(name):
langs=st.session_state[f'langs']
if langs: # 檢查 key 之值
st.write(f'{name} 選取了: {",".join(langs)}')
else:
st.write(f'{name} 未選取任何語言')
label='請選擇擅長的程式語言 : '
options=['Python', 'C++', 'Java', 'Javascript', 'PHP', 'Rust']
selected_items=st.multiselect(
label,
options,
key='langs',
on_change=on_multiselect_change,
args=('Tony',)
) # 傳回串列
此例傳入 on_change, key 與 args 參數, 其中 key 參數會在 st.session_state 字典中儲存下拉式選單狀態 (即被選取選項之串列), args 則傳遞名字到 on_change 事件處理函式的 name 參數, 在 on_multiselect_change() 中我們從 st.session_state 字典的 langs 鍵取得目前被選取之選項串列, 然後以逗號串皆為字串, 結果如下 :
如果取消所有選項結果如下 :
也可以用 kwargs 傳遞引數, 例如 :
測試 5 : 利用 kwargs 傳送引數給 on_change 事件處理函式 [看原始碼]
# st-multiselect-test-5.py
import streamlit as st
def on_multiselect_change(name=None):
langs=st.session_state[f'langs']
if langs: # 檢查 key 之值
st.write(f'{name} 選取了: {",".join(langs)}')
else:
st.write(f'{name} 未選取任何語言')
label='請選擇擅長的程式語言 : '
options=['Python', 'C++', 'Java', 'Javascript', 'PHP', 'Rust']
selected_items=st.multiselect(
label,
options,
key='langs',
on_change=on_multiselect_change,
kwargs={'name': 'Tony'}
) # 傳回串列
結果與上面一樣 :







沒有留言 :
張貼留言