『玩转Streamlit』--片段Fragments
在 Streamlit
应用开发中,Fragments
组件是一种用于更精细地控制页面元素更新和显示顺序的工具。
它允许开发者将内容分解成多个小的片段,这些片段可以按照特定的顺序或者逻辑进行更新,而不是一次性地更新整个页面或容器中的所有内容。
这为创建动态且交互性强的用户界面提供了更多的灵活性和控制力。
1. 概要
Fragments
有点像Web2.0
时的Ajax
技术,它能够把页面内容拆分成多个小片段,就像是把一幅完整的画分成了许多小拼图。
这样的好处是,Fragments
可以对更新操作进行细分,仅更新部分内容,提升页面响应速度。
从本质上说,它为开发者在构建动态、交互性强的应用界面时,提供了更高的灵活性和精准的内容控制能力。
Fragments
组件的参数不多,使用时一般通过st.fragment
装饰器来编写小片段,后续会通过示例来演示。
名称 | 类型 | 说明 |
---|---|---|
func | 函数对象 | 将其转换为片段的函数,@st.fragment 装饰器所装饰的函数 |
run_every | 整数、浮点数、时间间隔、字符串或None | None(默认值):片段仅在用户触发事件时重新运行。 整数或浮点数:指定以秒为单位的时间间隔,例如5表示每 5 秒自动重新运行片段。 字符串:指定时间格式,如"1d"(1 天)、"1.5 days"(1.5 天)或"1h23s"(1 小时 23 秒),该格式被 Pandas 的Timedelta构造函数支持。 timedelta对象(来自 Python 的内置datetime库):如timedelta(days=1)表示每天自动重新运行片段。 |
2. Fragments 和 Form 区别
Fragments
和上一篇介绍的Form
看起来很类似,都是将多个关联的组件组织起来,统一更新和管理。
实际上,它们的应用场景和工作方式区别很大,了解其中的区别,可以让我们更好的选择相应的组件。
2.1. 主要用途
从用途上来看,Fragments
主要用于:
- 实现引导式内容展示:用于创建引导性的应用界面,以逐步展示信息。例如,在一个数据分析应用的教程中,先使用
Fragments
展示数据加载的步骤,然后再展示数据分析方法的介绍。 - 优化页面更新性能:在处理大量数据或复杂 UI 更新时,
Fragments
可以将更新操作拆分成多个小片段更新。每次只刷新必要的部分,提高应用的响应速度。比如,在一个实时数据监控应用中,使用Fragments
可以分别更新不同数据图表的部分,而不是一次性更新整个页面的所有图表。 - 构建复杂交互逻辑:对于具有复杂交互逻辑的应用,
Fragments
能够帮助组织和控制页面元素的显示与隐藏。例如,在一个多步骤的操作流程应用中,通过Fragments
管理每个步骤中不同操作按钮和提示信息的显示和隐藏。
而Form
则主要用于:
- 数据收集:主要用于收集用户输入的数据。这可以是简单的文本信息,也可以是复杂的选择,如在一个产品配置表单中,用户通过下拉菜单选择产品型号、颜色等选项。
- 数据验证和提交:表单通常包含数据验证机制,以确保用户输入的数据符合要求。并且,表单提供了提交功能,将收集到的用户数据发送到服务器或者进行本地处理。
2.2. 工作方式
从组件的工作方式来看,Fragments
本身并不具有像表单那样固定的结构。
它更像是一个容器,可以容纳各种 Streamlit
组件,如文本、按钮、图表等。可以通过代码逻辑来控制这些组件在Fragments
中的显示顺序和条件。
而表单具有比较明确的结构,通常包含form
标签(在 HTML 层面)和一系列的输入组件,如st.text_input
、st.selectbox
等。
表单中的所有输入组件通常是相互关联的,它们共同构成了一个数据收集单元。
而且,表单可以通过st.form_submit_button
来触发提交操作,并且可以使用st.form
上下文管理器来确保表单内的组件数据在提交时能够正确地一起处理。
2.3. 数据处理
在数据处理方面,Fragments
相对灵活,例如,在一个包含多个Fragments
的应用中,
每个fragment
可能有自己独立的按钮,点击按钮后的既可以更新当前fragment
,也可以触发其他fragment
的更新。
数据交互更多地体现在不同fragment
之间的切换和内容更新上。
而Form
在数据处理主要围绕用户输入的数据,在表单提交后,通常会对收集到的数据进行验证、清洗和存储等操作。
例如,将用户在表单中输入的注册信息发送到数据库进行存储,或者根据用户在表单中选择的查询条件从数据库中获取数据并显示。
表单内的交互主要集中在用户输入和提交操作上,以及根据输入数据的合法性给予用户相应的反馈,如提示输入错误信息等。
3. Fragments使用示例
下面通过两个根据实际情况简化的示例来演示Fragments
的使用场景。
3.1. 逐步显示信息
在这个示例中,我们创建了一个产品介绍页面,通过Fragments
组件将信息分成三个步骤逐步显示。
首先显示欢迎信息,当用户点击 【点击了解更多】按钮后,显示产品功能信息,
再点击【继续下一步】按钮后,显示产品优势信息。
import streamlit as st
@st.fragment
def step1():
st.write("欢迎来到我们的产品介绍页面。")
if st.button("点击了解更多", key="step1"):
step2()
@st.fragment
def step2():
st.write("这是我们产品的主要功能:功能 1、功能 2、功能 3。")
if st.button("继续下一步", key="step2"):
step3()
@st.fragment
def step3():
st.write("最后,这是我们产品的优势所在,如高效性、易用性等。")
if st.button("刷新", key="step3"):
st.rerun()
# 初始显示第一个片段
step1()
3.2. 局部刷新页面
这个示例模拟一个数据展示大屏,大屏被分成两列,分别展示销售数据和流量数据。
每个数据区域都有自己的刷新按钮,点击按钮时,只会重新运行对应的 fragment
函数,从而实现该区域数据的局部刷新,不会影响其他部分。
import streamlit as st
import random
# 模拟获取一些数据
def get_sales_data():
return random.randint(100, 1000)
def get_traffic_data():
return random.randint(50, 500)
# 创建销售数据展示片段
@st.fragment
def sales_data_fragment():
st.subheader("销售数据")
# 获取并显示销售数据
sales_data = get_sales_data()
st.write(f"今日销售额: {sales_data}")
# 销售数据的局部刷新
if st.button("刷新销售数据", key="sales"):
st.rerun(scope="fragment")
# 创建流量数据展示片段
@st.fragment
def traffic_data_fragment():
st.subheader("流量数据")
# 获取并显示流量数据
traffic_data = get_traffic_data()
st.write(f"今日流量: {traffic_data}")
# 流量数据的局部刷新
if st.button("刷新流量数据", key="traffic"):
st.rerun(scope="fragment")
# 主函数,在大屏上排列各个片段
def main():
# 将屏幕划分为两列,分别放置不同的片段
col1, col2 = st.columns(2)
with col1:
sales_data_fragment()
with col2:
traffic_data_fragment()
if __name__ == "__main__":
main()
4. 总结
最后,总结下应该在什么时候可以考虑选择Fragments
来构建我们的streamlit
应用。
首先,需要逐步显示信息时,可以考虑使用Fragments
。
例如在创建一个教程或者引导性的应用界面时,先显示一部分说明文字,然后在用户进行某个操作(如点击按钮)后再显示下一步的内容,而不是一次性将所有教程信息都呈现给用户,避免信息过载,影响用户的理解和操作体验。
其次,优化页面更新性能时,可以考虑使用Fragments
。
比如,当应用中有大量数据或者复杂的 UI 更新时,Fragments
组件可以将更新操作拆分成多个小的片段更新。这样,在每次更新时只刷新必要的部分,减少了页面重新渲染的工作量,从而提高应用的响应速度和性能。
还有构建复杂交互逻辑时,也可以考虑使用Fragments
。
在构建具有复杂交互逻辑的应用时,Fragments
组件能够帮助开发者更好地组织和控制页面元素的显示与隐藏。
『玩转Streamlit』--片段Fragments的更多相关文章
- Github 恶搞教程(一起『玩坏』自己的 Github 吧)
最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
- 2017-2018-2 20155303『网络对抗技术』Exp1:PC平台逆向破解
2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 --------CONTENTS-------- 1. 逆向及Bof基础实践说明 2. 直接修改程序机器指令,改变程序执行流程 3. ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析
2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌图片:自己的图片控件
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- 『Asp.Net 组件』第一个 Asp.Net 服务器组件:自己的文本框控件
代码: using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace DemoWebControl ...
- 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势
在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...
- 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...
随机推荐
- 了解 Flutter 3.16 功能更新
作者 / Kevin Chisholm 我们在季度 Flutter 稳定版发布会上带来了 Flutter 3.16,此版本包含诸多更新: Material 3 成为新的默认主题.为 Android 带 ...
- 加入 Flutter Engage,Pick 您的专属 Dash 形象!
Flutter Engage 活动精彩来袭 对 Flutter 团队的开发者们来说,交流的重要性不言而喻,和您一样,我们也希望开发者们能够在不同的情境下进行互动分享.于是我们为您准备了一场特别的线上活 ...
- 数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪
数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪 随着全球对可持续发展和产品透明度的关注日益增加,企业需要一种可靠的方法来跟踪和管理产品生命周期中的关键数据.我们 ...
- Android性能优化(一)—— 启动优化,冷启动,热启动,温启动
APP启动方式 App启动方式分三种:冷启动(cold start).热启动(hot start).温启动(warm start) ▲ 冷启动 系统不存在App进程(APP首次启动或APP被完全杀死) ...
- ADO.NET 连接数据库 【vs2022 + sqlServer】
using System.Data; using System.Data.SqlClient; namespace Zhu.ADO.NET { internal class Program { pri ...
- 静态库封装之ComStr类
ComStr.h #pragma once #include <string> #include <vector> using namespace std; class Com ...
- 工作使用:Exchange命令集(超级重要)
工作使用:Exchange命令集(超级重要) 命令1:导出某个用户的邮件 New-MailboxExportRequest -mailbox dusonglin ...
- KubeSphere 3.1.0 GA:混合多云走向边缘,让应用无处不在
2021 年 4 月 29 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere 3.1.0 正式发布!为了帮助企业最大化资源利用效率,KubeSphere 打造了一个以 Kube ...
- KubeSphere 社区双周报 | KubeKey 新增网络插件 Hybridnet | 2023.08.18-08.31
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- KubeSphere 社区双周报 | OpenFunction 支持 Dapr 状态管理 | 2023.03.31-04.13
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...