2025年5月21日 星期三

Streamlit 學習筆記 : 使用者輸入元件 (七) 多行文字輸入框

本篇旨在測試 Streamlit 的多行文字輸入框函式 st.text_area().

本系列所有測試文章參考 :


呼叫 st.text_area() 函式並傳入必要參數 label 會建立一個單行文字輸入框, 其參數結構如下 : 

st.text_area(label, value="", height=None, max_chars=None, key=None, help=None, on_change=None, args=None, kwargs=None, placeholder=None, disabled=False, label_visibility="visible")

可見基本上與 st.text_input() 的參數結構幾乎相同, 只有一個必要參數 label (但沒有 autocomplete 參數), 因為 st.text_area() 可輸入多行文字故多了一個 height 參數, 傳回值是輸入框內所輸入之字串. 

參數說明如下表 :


st.text_area() 之參數 說明
label 文字框旁的標籤文字。
value 預設顯示的文字,預設為空字串。
height 文字框的高度(像素)。若未設定,則會自動調整高度。
max_chars 允許輸入的最大字元數,超過則無法再輸入。
key 為元件設定唯一鍵值,避免重複。
help 當滑鼠懸停時顯示的提示文字。
on_change 當內容變動時所觸發的回呼函式。
args 傳遞給 on_change 的參數(位置引數)。
kwargs 傳遞給 on_change 的參數(關鍵字引數)。
placeholder 顯示在空白文字框中的提示文字。
disabled 設為 True 時禁用輸入框。
label_visibility 控制標籤是否可見,值可為 "visible"、"hidden" 或 "collapsed"。


例如 :  


測試 1 : 預設高度的多行文字輸入框 [看原始碼

# st-text_area-test-1.py
import streamlit as st

st.subheader('留言板')
msg=st.text_area('請輸入留言 :')
if msg:
    st.write(msg)

此例僅傳入必要參數 label, 結果如下 : 




可見多行文字輸入框 height 參數預設雖然為 None, 但實際上預設高度可輸入 3 行資料 
(實際渲染高度約 136 px) , 當輸入內容超過時會自動出現卷軸), 可以拖曳右下角小按鈕手動縮放輸入框大小, 注意, 輸入完成要按 Ctrl+Enter 才會發生 on_change 事件傳回輸入文字, 如果只按 Enter 只是在輸入框中跳下一行而已. 

下面範例傳入 value 參數設定輸入框預設內容 (也可以做為輸入提示) 並傳入 height 參數設定輸入框高度 : 


測試 2 : 參數 value 與 height 用法 [看原始碼]    

# st-text_area-test-2.py
import streamlit as st

st.subheader('留言板')
msg=st.text_area('請輸入留言 :', value='優良賣家', height=200)
if msg:
    st.write(msg)

結果如下 : 




可見由於 value 已設定了輸入框的值, 所以初始化時 msg 有值就輸出此內容了. 

如果只是要做輸入提示的話, 傳入 placeholder 參數可能較好, 例如 : 


測試 3 : 參數 placeholder 與 max_chars 的用法 [看原始碼   

# st-text_area-test-3.py
import streamlit as st

st.subheader('留言板')
msg=st.text_area('請輸入留言 :', placeholder='優良賣家', max_chars=100)
if msg:
    st.write(msg)

結果如下 :




由於 placeholder 與 value 無關, 初始化時 value 是預設值空字串, 所以 if msg 為 False 就沒有輸出結果了. 注意, 若輸入之字元數超過 max_chars 時就無法再繼續輸入了.

下列範例測試 on_change 與 args 參數 : 


測試 4 : 參數 on_change 與 args 參數用法 [看原始碼]    

# st-text_area-test-4.py
import streamlit as st

def on_text_change(user):
    comment=st.session_state['comment']
    st.write(f'{user} 留言 : {comment}')

st.subheader('留言板')
msg=st.text_area(
    '請輸入留言 :',
    key='comment',
    on_change=on_text_change,
    args=('匿名',)
    )

此例利用設定 key 讓輸入框的值會記錄在 st.seesion_state 字典中, 當在輸入框按下 Ctrl+Enter 時會觸發 on_change 事件呼叫 on_text_change() 並透過 args 傳遞引數, 結果如下 : 




引數也可以透過 kwargs 參數傳遞, 例如 :


測試 5 : 參數 on_change 與 kwargs 參數用法 [看原始碼      

# st-text_area-test-5.py
import streamlit as st

def on_text_change(user):
    comment=st.session_state['comment']
    st.write(f'{user} 留言 : {comment}')

st.subheader('留言板')
msg=st.text_area(
    '請輸入留言 :',
    key='comment',
    on_change=on_text_change,
    kwargs={'user': '匿名'}
    )

此例只是將上例的 args 元組改為 kwargs 字典傳遞, 結果如下 : 



沒有留言 :