streamlit控件和控制1
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