streamlit控件和控制1

发布时间 2023-11-01 11:40:20作者: 贝壳里的星海

streamlit控件和控制

元素控件

button:			  #按钮
download_button:  #文件下载
file_uploader:	  #文件上传
checkbox:	      #复选框
radio:		      #单选框
selectbox:	      #下拉单选框
multiselect:	  #下拉多选框
slider:		      #滑动条
select_slider:    #选择条
text_input:       #文本输入框
text_area:        #文本输入区域
number_input:     #数字输入框,支持加减按钮
date_input:       #日期选择框
time_input:	      #时间选择框
color_picker:     #颜色选择器

状态元素

st.progress:	#进度条 
st.spinner:		#等待提示

st.status:		 #显示状态
st.toast:        #显示短消息
st.info:        #显示常规信息
st.success:		#显示成功信息
st.warning:		#显示报警信息
st.error:		#显示错误信息
st.exception:	#显示异常信息

st.balloons:	#页面底部飘气球,表示庆祝
st.snow: 		 #页面飘雪,表示庆祝

st.button特性

使用 st.button 函数创建的按钮具有独特的特点。按钮在点击后不会保留状态。
相反,当按钮被点击后,脚本会重新运行,并且按钮在下一次脚本重新运行时立即返回到原始状态。代码和变量初始化。
如果在st.button函数中嵌套了可见元素,则该元素将在按钮被点击时显示,并在用户进行下一次操作后立即消失。
这是因为脚本重新运行,按钮的返回值在按钮点击事件中变为True,并在下一次脚本重新运行时返回为False。

显示临时消息

import streamlit as st

fruit_list = ['Apple', 'Banana', 'Orange', 'Mango']

fruit = st.text_input('输入一个水果')

if st.button('检查是包含'):
    if fruit.lower() in fruit_list:
   		st.success("包含该水果")
    else:
        st.warning("缺乏该水果")

脚本将重新运行,并且消息会在他们再次点击"检查是包含"按钮之前消失。    并不能进行状态保存

状态保留,回调函数

要求点击后,保留上次点击的状态

使用Streamlit的session_state功能来实现这个目标。我将为你展示如何创建一个变量,然后使用按钮点击事件将该变量的值设置为True。
import streamlit as st
from datetime import date, datetime

if 'clicked' not in st.session_state:
    st.session_state.clicked = False
 
if 'button' not in st.session_state:
    st.session_state.button = False   
    

def click_clicked():
    st.session_state.clicked = True

def click_button():
    st.session_state.button = True

def click_clear():
    st.session_state.clicked = False
    st.session_state.button = False 


def main():
    st.subheader ("多个button输出示例")

    button=st.button("显示日期",on_click=click_clicked)
    if st.session_state.clicked:
    # 消息和嵌套小部件将保留在页面上
        st.write("当前日期为:", date.today())
        
    st.button('点击我', on_click=click_button)
    st.write('按钮已点击!')
    
    if st.session_state.button:
    # 消息和嵌套小部件将保留在页面上
        st.slider('选择一个值')
        
    st.button('消除状态', on_click=click_clear)
    
    
if __name__ == "__main__":
    main()

# 可以在回调函数中添加
import streamlit as st

st.title('Counter Example using Callbacks with args')
if 'count' not in st.session_state:
    st.session_state.count = 0

increment_value = st.number_input('Enter a value', value=0, step=1)

def increment_counter(increment_value):
    st.session_state.count += increment_value

increment = st.button('Increment', on_click=increment_counter,
    args=(increment_value, ))

st.write('Count = ', st.session_state.count)

切换按钮

import streamlit as st

# 通过 对 session_state 中状态的 操作,控制按钮的切换
if 'button' not in st.session_state:
    st.session_state.button = False

def click_button():
    st.session_state.button = not st.session_state.button

st.button('点击我', on_click=click_button)


if st.session_state.button:
    # 消息和嵌套小部件将保留在页面上
    st.write('按钮已打开!')
    st.slider('选择一个值')
else:
    st.write('按钮已关闭!')

控制流

import streamlit as st

# 通过stage的状态数值, 来控制相关逻辑流

if 'stage' not in st.session_state:
    st.session_state.stage = 0

def set_state(i):
    st.session_state.stage = i

if st.session_state.stage == 0:
    st.button('开始', on_click=set_state, args=[1])

if st.session_state.stage >= 1:
    name = st.text_input('姓名', on_change=set_state, args=[2])

if st.session_state.stage >= 2:
    st.write(f'你好,{name} ')
    color = st.selectbox(
        '选择一种颜色',
        [None, '红色', '橙色', '绿色', '蓝色', '紫色'],
        on_change=set_state, args=[3]
    )
    if color is None:
        set_state(2)

if st.session_state.stage >= 3:
    st.write(f' 选择完成:{color}')
    st.button('重新开始', on_click=set_state, args=[0])

动态增删元素

import streamlit as st

# 通过stage的状态数值, 自动动态更新增删相关元素

def display_input_row(index):
    left, middle, right = st.columns(3)
    left.text_input('First', key=f'first_{index}')
    middle.text_input('Middle', key=f'middle_{index}')
    right.text_input('Last', key=f'last_{index}')


if 'rows' not in st.session_state:
    st.session_state['rows'] = 0


def increase_rows():
    st.session_state['rows'] += 1
    
def delete_rows():
    if st.session_state['rows'] > 0:
        st.session_state['rows'] -= 1   

st.button('Add person', on_click=increase_rows)
st.button('Remove person', on_click=delete_rows)


for i in range(st.session_state['rows']):
    display_input_row(i)


st.subheader('People')
for i in range(st.session_state['rows']):
    st.write(
        f'Person {i+1}:',
        st.session_state[f'first_{i}'],
        st.session_state[f'middle_{i}'],
        st.session_state[f'last_{i}']
    )

常见错误

按钮嵌套错误

import streamlit as st

if st.button('Button 1'):
    st.write('Button 1 was clicked')
    if st.button('Button 2'):
        # This will never be executed.
        st.write('Button 2 was clicked')

# 按钮2被嵌套在按钮1的内部。这种嵌套将导致按钮2永远不会被执行

按钮关联错误

import streamlit as st
import pandas as pd

file = st.file_uploader("Upload a file", type="csv")

button1 = st.button('Get data')
if button1:
    df = pd.read_csv(file)
    # This display will go away with the user's next action.
    st.write(df)

button2 = st.button('Save')
if button2:
    # This will always error.
    df.to_csv('data.csv')

# button1 和 button2 相互关联,但是并没有对状态进行保存

参考资料

https://blog.csdn.net/weixin_46043195/article/details/132115271

https://www.qixinbo.info/2022/03/10/streamlit_2/