首页 > 其他分享 >Streamlit 讲解专栏(四):深入理解按钮行为

Streamlit 讲解专栏(四):深入理解按钮行为

时间:2023-08-15 18:03:02浏览次数:47  
标签:button 点击 st state session 专栏 按钮 Streamlit



文章目录

  • 1 前言
  • 2 Streamlit中if st.button()的使用时机
  • 3 按钮的逻辑
  • 3.1 通过按钮显示临时消息的常用逻辑
  • 3.2 状态保留按钮
  • 3.3 切换按钮
  • 3.4 控制流程的按钮
  • 3.5 动态添加小部件的按钮
  • 3.6 使用按钮处理耗时或写入文件的过程
  • 4 常见的按钮反模式
  • 4.1 按钮嵌套在按钮内部
  • 4.2 将其他小部件嵌套在按钮内部
  • 4.3 在按钮内部嵌套处理过程,但未保存到会话状态中
  • 5 结语


Streamlit 讲解专栏(四):深入理解按钮行为_前端

1 前言

欢迎来到我们关于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 '我们没有这个动物。'

Streamlit 讲解专栏(四):深入理解按钮行为_数据分析_02


Streamlit 讲解专栏(四):深入理解按钮行为_streamlit_03

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('选择一个值')

Streamlit 讲解专栏(四):深入理解按钮行为_前端_04

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('按钮已关闭!')

Streamlit 讲解专栏(四):深入理解按钮行为_前端_05

3.4 控制流程的按钮

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

  1. 用户开始之前。
  2. 用户输入姓名。
  3. 用户选择颜色。
  4. 用户收到感谢消息。

在开始阶段,一个按钮可以将阶段从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])

在阶段1和2中,我们可以使用回调函数来设置阶段的值。例如,在阶段1中,我们可以使用text_input小部件来获取用户的姓名,并在值更改时将阶段设置为2:

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

在阶段2中,我们可以显示根据用户输入的姓名显示的消息,并通过使用selectbox小部件来让用户选择颜色。如果颜色选择框的值为None,我们可以将阶段设置回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)

在阶段3中,我们可以显示一个带有感谢消息的消息,并创建一个按钮来将阶段重置为0:

if st.session_state.stage >= 3:
    st.write(f'

标签:button,点击,st,state,session,专栏,按钮,Streamlit
From: https://blog.51cto.com/u_15229916/7091739

相关文章

  • 网页中的快捷复制按钮实现
    有时我们需要实现快捷复制某些信息的功能,例如下图所示:这时我们可以使用document的execCommand来实现这一功能。代码参考:constcopyKey=val=>{constinput=document.createElement('input')input.setAttribute('readonly','readonly')input.setAttribute('valu......
  • EAS_客户端设置按钮和菜单栏操作选项隐藏
    我们要想隐藏客户端的按钮或者菜单,防止操作,可以在listUI或者EditUI中onload()方法中使用下列方式来设置控件是否显示和是否可用,控件名可通过dep查看或者通过shift+alt+d来查看控件publicvoidonload(){//禁用按钮this.btnSave.setVisible(false);......
  • 【产品人卫朋】专栏及配套资料更新:华为流程体系、产品经理、IPD与BLM模型
    目录前言01华为流程体系专栏02产品经理进阶专栏03华为战略方法论专栏04IPD进阶100例专栏作者介绍前言截止目前,本号已上线四大干货专栏,内容涉及:01华为流程体系(图文+视频);02硬件产品经理(图文+视频);03BLM战略方法论(图文+视频);04集成产品开发IPD体系(图文)。四大专栏具体内容......
  • 使用vue自定义指令实现按钮权限管理
    原文链接:https://www.jianshu.com/p/f7d6b9420cee官网链接:https://v2.cn.vuejs.org/v2/guide/custom-directive.html注册全局指令Vue提供了一个directive方法给我们注册自定义指令,在main.js中注册一个全局的自定义指令。directive方法接收两个参数:指令名称、包含指令钩子函......
  • WinForm DevExpress 添加行内按钮
    1.在设计器里面添加一列,设置单元格不可编辑、只读属性   2.在所在GridView属性里面添加CustomDrawCell事件与RowCellClick事件privatevoidgvMain_CustomDrawCell(objectsender,DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgse){......
  • WPF自定义控件实战:自制上传文件显示进度按钮
    自定义控件在WPF开发中是很常见的,有时候某些控件需要契合业务或者美化统一样式,这时候就需要对控件做出一些改造。 目录按钮设置圆角按钮上传文件相关定义测试代码 话不多说直接看效果默认效果:上传效果:按钮设置圆角因为按钮本身没有CornerRadius属性,所......
  • 【验证码逆向专栏】最新某度旋转验证码 v2 逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • 在传奇游戏界面添加或删除自定义功能按钮
    本教程是以HERO引擎和非凡登录器(原猎鹰登录器)为例进行示范,其他引擎请自行进行测试,。自定义功能按钮就是在游戏界面中处于小地图,组队等按钮上面的一排可自定义进行功能设置的按钮,如图中所示,用方框选中的就是想要达到的效果。以下是具体添加方法:首先要下载下面我们给大家准备好的一......
  • Streamlit 入门教程:构建一个Dashboard
    Streamlit是一个用于创建数据科学和机器学习应用程序的开源Python库。它的主要目标是使开发人员能够以简单的方式快速构建交互式的数据应用,而无需过多的前端开发经验。Streamlit提供了一种简单的方法来转换数据脚本或分析代码为具有可视化界面的应用程序,这些应用程序可以通过......
  • avue组件自定义按钮/标题/内容/搜索栏
    话不多说笔记直接分享!!一、自定义crud搜索栏组件<templateslot-scope="scope"slot="provinceCodeSearch"> <avue-select v-model="objFrom.provinceCode"//这是存放省份的code placeholder="请选择省市" :di......