1 前言🚀
欢迎来到我们关于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])