2025年5月20日 星期二

Streamlit 學習筆記 : 使用者輸入元件 (五) 多選下拉式選單

本篇旨在測試使用者輸入元件之多選下拉式選單 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'}
    ) # 傳回串列

結果與上面一樣 :




沒有留言 :