2025年5月21日 星期三

Streamlit 學習筆記 : 使用者輸入元件 (八) 數值輸入框

本篇旨在測試 Streamlit 的數值輸入框函式 st.number_input().

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


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

st.number_input(label, min_value=None, max_value=None, value=0.0, step=None, format=None, key=None, help=None, on_change=None, args=None, kwargs=None, *, disabled=False, label_visibility="visible", placeholder=None)

此函式只有一個必要參數 label, 因為 st.text_area() 可輸入多行文字故多了一個 height 參數, 傳回值是輸入框內所輸入之數值 (int 或 float). 

參數說明如下表 :


st.number_input() 之參數 說明
label顯示在輸入框旁的標籤文字。
min_value允許的最小值,預設為無限制。
max_value允許的最大值,預設為無限制。
value初始值,預設為 0.0。
step每次增加或減少的步進值,預設為 1。
format格式化顯示輸入數值的格式,例如 "%.2f"
key可選的唯一識別鍵,避免重複使用。
help滑鼠懸停時顯示的提示文字。
on_change當輸入值變更時觸發的回呼函式。
args傳遞給 on_change 的位置參數 (tuple)。
kwargs傳遞給 on_change 的關鍵字參數 (dict)。
disabled若設為 True,則此元件為不可操作狀態。
label_visibility控制標籤的顯示方式:'visible'(預設)、'hidden' 或 'collapsed'。
placeholder輸入框內的預設提示文字(僅在未輸入時顯示)。


注意, min_value, max_value, value, 與 step 這四個參數型態必須一致, 即全為整數或全為浮點數, 不可以有的是整數, 有的卻是浮點數 (會拋出例外), 例如 : 


測試 1 : 輸入整數 [看原始碼

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

age=st.number_input('請輸入年齡:', min_value=0, max_value=120, value=25, step=1)
st.write(f'您的年齡是:{age}')

結果如下 : 




可見輸入框右邊有 + 與 - 按鈕可依照 step 參數值增減數值. 

下面試輸入浮點數的例子 :


測試 2 : 輸入浮點數 [看原始碼   

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

weight1=st.number_input('請輸入體重:', min_value=0.0, max_value=150.0, value=50.0, step=1.0)
st.write(f'您的體重是:{weight1}')

結果如下 :




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


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

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

def show_value(var):
    value=st.session_state[var]
    st.write(f'{var} 目前的數值是:{value}')

st.number_input('請輸入 A 之值:', key='A', on_change=show_value, args=('A',))
st.number_input('請輸入 B 之值:', key='B', on_change=show_value, args=('B',))

此例任一個輸入框數值有改變時便會觸發 on_change 事件呼叫 show_value() 函式並用 args 傳遞引數給 var, 利用其作為 key 在 st.session_state 字典中取得所記錄之輸入框數值後顯示, 結果如下 :



 
也可以用 kwargs 來傳遞引數 :


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

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

def show_value(var):
    value=st.session_state[var]
    st.write(f'{var} 目前的數值是:{value}')

st.number_input('請輸入 A 之值:', key='A', on_change=show_value, kwargs={'var': 'A'})
st.number_input('請輸入 B 之值:', key='B', on_change=show_value, kwargs={'var': 'B'})

結果與上例相同 : 




下面測試 format 參數, 此參數用來控制元件上數值的顯示格式, 不影響函式的傳回值, 使用 Python 的格式化字串例如 %d, %e, %f, %g, %i, 與 %u 等, 參考 :


對於數值輸入而言最常用的是 %d 與 %f, 用法摘要如下表 :


常用 format 參數值範例  說明
%d 整數顯示格式,例如 1、2、3
%.0f 即始是浮點數也只顯示整數部分
%.1f 顯示一位小數,例如 1.0、2.5
%.2f 顯示兩位小數,例如 1.01、2.57


例如 : 


測試 5 : 參數 format 用法 [看原始碼   

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

st.subheader('format 參數測試')
st.number_input('整數', 0, 10, step=1, format='%d')
st.number_input('整數', 0.0, 10.0, step=0.1, format='%.0f')
st.number_input('一位小數', 0.0, 10.0, step=0.1, format='%.1f')
st.number_input('兩位小數', 0.0, 10.0, step=0.01, format='%.2f')

結果如下 : 




請注意 %.0f 格式雖然值為浮點數, 但 0f 表示不顯示小數只顯示整數, 因此增減數值時要等到整數部分改變數值才會顯示變化, 但不影響其傳回值. 

沒有留言 :