深入理解Streamlit中的按钮行为(四):示例与最佳实践(上)

简介: 深入理解Streamlit中的按钮行为(四):示例与最佳实践

1 前言🚀


欢迎来到我们关于Streamlit按钮行为的全面指南!按钮在Streamlit应用程序中是用户交互的基本组件。无论你是刚开始接触Streamlit还是已经有了一些经验,本指南都将为你提供如何在应用程序中有效使用按钮的坚实基础。在本文中,我们还将参考我之前写的三篇相关文章:


Streamlit初识(一)——安装以及初步应用:

引导你从安装开始,快速了解Streamlit的基本使用方法。


Streamlit的第一个应用(二): 展示了如何使用Streamlit创建一个简单的应用程序,让你感受到Streamlit的便捷和效果。


Streamlit应用中构建多页面(三):两种方案: 分享了构建多页面应用程序的两种方案,帮助你进一步扩展并优化你的应用。


本篇指南将深入探讨按钮行为的细微差别,探索各种示例,并解释常见的误解。

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


在本章中,我们将展示多个示例,以说明在利用Streamlit的st.session_state时如何实际使用按钮。建议您已经安装了Streamlit并熟悉其主要概念。


2 Streamlit中if st.button()的使用时机 🎯💡


这个函数的使用可以根据按钮的值来决定执行某段代码,点击按钮后只执行一次,直到再次点击按钮。


适合将if st.button()嵌套在里面的场景包括:


✅ 瞬时消失的消息:一旦按钮被点击,显示消息但立即消失。


✅ 每次点击后执行的过程:将数据保存到会话状态、文件或数据库


而不适合将if st.button()嵌套在里面的场景包括:


❌ 需要在用户继续操作时保留的显示项。


❌ 引起脚本重新运行的其他小部件使用。


❌ 既不修改会话状态也不写入文件/数据库的过程*。(*当需要一次性结果时,这种情况也可以接受。例如,如果你有一个“验证”按钮,可以将它作为直接依赖于按钮的流程,用于创建一个弹出消息,告诉用户’有效’或’无效’,而不需要保留这些信息。)


3 按钮的逻辑

3.1 通过按钮显示临时消息的常用逻辑 📢💡


如果你想给用户一个快速的按钮,让他们检查一个条目是否有效,但不想在用户继续操作时继续显示该检查结果。


在这个示例中,用户可以点击一个按钮来检查他们的字符串是否在列表中。当用户点击“检查可用性”按钮时,他们将看到“我们有这个动物!”或“我们没有这个动物。”如果他们在st.text_input中更改了动物的输入,脚本将重新运行,并且消息会在他们再次点击“检查可用性”按钮之前消失。

import streamlit as st
animal_shelter = ['cat', 'dog', 'rabbit', 'bird']
animal = st.text_input('输入一个动物')
if st.button('检查可用性'):
    have_it = animal.lower() in animal_shelter
    '我们有这个动物!' if have_it else '我们没有这个动物。'


3.2 状态保留按钮 🪄🔘


在这个例子中,我们可以使用Streamlit的session_state功能来实现这个目标。我将为你展示如何创建一个变量,然后使用按钮点击事件将该变量的值设置为True。

首先,我们需要导入Streamlit库:

import streamlit as st

在使用session_state之前,我们需要确认该变量是否已经存在于session_state中,如果不存在,我们可以设置它的初始值为False:

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


接下来,我们定义一个回调函数click_button(),在按钮点击事件发生时,我们将clicked变量的值设置为True:

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


现在,我们可以创建一个按钮,并使用on_click参数将回调函数与按钮关联起来:

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

最后,我们可以通过检查clicked变量的值来确定按钮是否被点击了。如果点击了按钮,我们可以在页面上保留相应的消息和嵌套小部件:

if st.session_state.clicked:
    # 消息和嵌套小部件将保留在页面上
    st.write('按钮已点击!')
    st.slider('选择一个值')


3.3 切换按钮 🔄🔘


如果你想让按钮像一个切换开关一样工作,那么可以考虑使用st.checkbox。否则,你可以使用一个带有回调函数的按钮来反转保存在st.session_state中的布尔值。


在这个例子中,我们使用一个按钮来控制另一个小部件的显示与隐藏。通过根据button变量的值在条件语句中显示或隐藏st.slider,用户可以在不让它消失的情况下与滑动条进行交互。


首先,我们需要导入Streamlit库:

import streamlit as st

在使用session_state之前,我们需要确认该变量是否已经存在于session_state中,如果不存在,我们可以设置它的初始值为False:

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

接下来,我们定义一个回调函数click_button(),在按钮点击事件发生时,我们将button变量的值取反:

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


现在,我们可以创建一个按钮,并使用on_click参数将回调函数与按钮关联起来:

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

然后,我们可以通过检查button变量的值来确定按钮是否处于打开状态。如果按钮处于打开状态,我们将保留相应的消息和嵌套小部件:

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


3.4 控制流程的按钮 🕹️🔘


与将内容嵌套在按钮中不同,另一种方法是使用st.session_state中的值来指定流程的"步骤"或"阶段"。在这个例子中,我们的脚本有四个阶段:


用户开始之前。

用户输入姓名。

用户选择颜色。

用户收到感谢消息。

在开始阶段,一个按钮可以将阶段从0增加到1。在结束阶段,一个按钮可以将阶段从3重置为0。在阶段1和2中使用的其他小部件具有回调函数来设置阶段。如果你的流程有依赖步骤,并且想保持之前的阶段可见,那么这样的回调函数会强制用户在更改之前的小部件时重新跟踪后续阶段。


首先,我们需要导入Streamlit库:

import streamlit as st

在使用session_state之前,我们需要确认该变量是否已经存在于session_state中,如果不存在,我们可以设置它的初始值为0:

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


接下来,我们定义一个函数set_state(i),用于设置阶段变量的值:

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


然后,根据当前阶段的值,我们可以显示不同的内容。在阶段0中,我们可以创建一个按钮来将阶段增加到1:

if st.session_state.stage == 0:
    st.button('开始', on_click=set_state, args=[1])
相关文章
|
存储 缓存 数据可视化
(七)解析Streamlit的数据元素:探索st.dataframe、st.data_editor、st.column_config、st.table、st.metric和st.json的神奇之处(上)
(七)解析Streamlit的数据元素:探索st.dataframe、st.data_editor、st.column_config、st.table、st.metric和st.json的神奇之处
6607 0
|
存储 设计模式 前端开发
Streamlit应用中构建多页面(三):两种方案(上)
Streamlit应用中构建多页面(三):两种方案
4072 0
|
定位技术
Streamlit的第一个应用(二)(下)
Streamlit的第一个应用(二)
494 0
|
11月前
|
机器学习/深度学习 人工智能 数据处理
[python 技巧] 快速掌握Streamlit: python快速原型开发工具
本文旨在快速上手python的streamlit库,包括安装,输入数据,绘制图表,基础控件,进度条,免费部署。
1243 64
[python 技巧] 快速掌握Streamlit: python快速原型开发工具
|
11月前
|
Python
使用pycharm 开发streamlit的项目启动
要在 PyCharm 中配置 Streamlit 环境并调试应用,请按以下步骤操作:1. 确保 PyCharm 配置了 Python 解释器并安装 Streamlit 包(File -> Settings -> Project -> Python Interpreter)。2. 配置调试运行设置(Run -> Edit Configurations,添加 Python 配置并命名)。3. 选择新配置并点击调试按钮启动应用。
1131 23
|
数据可视化 前端开发 数据安全/隐私保护
Streamlit快速构建数据应用程序
【10月更文挑战第21天】Streamlit 是一个开源的 Python 库,用于快速构建数据应用程序。它简化了数据可视化的开发过程,允许用户通过简单的 Python 脚本创建交互式应用,而无需编写复杂的前端代码。本文介绍了 Streamlit 的基本概念、安装方法、示例应用的创建、扩展功能及部署方法,展示了其在 Python 可视化领域的潜力和优势。
|
数据可视化 安全 数据挖掘
streamlit (python构建web)之环境搭建
在微信订阅号中发现了一篇关于Streamlit的文章,激发了我的兴趣。Streamlit是一款专为数据科学家设计的开源Python库,能迅速将数据分析脚本转变为功能完备的Web应用。它简化了开发流程,支持轻松添加交互组件及动态展示图表、图像等,非常适合开发安全扫描工具。Streamlit基于Jupyter Notebook原理,通过Python脚本创建可视化和交互式的Web应用,易于部署分享。安装方法多样,可通过`pip install streamlit`快速安装,或通过Anaconda环境管理依赖。启动示例应用只需运行简单命令,即可体验自带的动画、绘图和数据展示等功能。
1342 1
streamlit (python构建web)之环境搭建
|
IDE 开发工具 Python
python3代码编程规范(命名、空格、注释、代码布局、编程建议等)
该文章详细介绍了Python3的编程规范,包括命名、空格使用、注释、代码布局等方面的最佳实践,帮助提升代码的可读性和一致性。
1289 0
|
Python
Python中使用`requests`库进行流式响应处理的技术详解
【4月更文挑战第12天】在Python的网络编程中,处理大文件或数据流时,一次性加载整个响应内容到内存中可能会导致内存不足的问题。为了解决这个问题,`requests`库提供了流式响应处理的功能,允许我们逐块读取响应内容,从而更有效地管理内存。本文将详细介绍如何在Python中使用`requests`库进行流式响应处理。
4078 2
|
数据可视化 前端开发 数据挖掘
数据分析可视化神器---streamlit框架,各种图表绘制,布局以及生产综合案例剖析
数据分析可视化神器---streamlit框架,各种图表绘制,布局以及生产综合案例剖析
2707 0