改进流光应用与片段
Streamlit是一个Python库,旨在快速轻松地创建数据驱动的应用程序,最近越来越受欢迎. 根据谷歌趋势, 现在关于Streamlit的谷歌搜索比Streamlit历史上任何时候都要多. 它不仅现在很流行, 但趋势显示,streamlight的使用每年都呈指数级增长. 随着它的人气的巨大增长, 现在是学习streamlight的最佳时机. 幸运的是,开发者可能错过了直到现在, Streamlit的API是直观的,并且大多数都有良好的文档. 然而,在Streamlit中有一些东西是很难理解的. 最明显的例子之一就是片段. Fragments是开发人员定义Streamlit程序的一种方式,它可以独立于页面的其余部分重新加载. 这种行为非常强大,但也可能非常令人困惑. 本文将讨论Streamlit如何在没有片段的情况下工作, 这种行为如何随着片段的增加而改变, 以及开发人员如何开始在他们的Streamlit应用程序中使用片段.
回来ground
让mg官方游戏中心从检查没有碎片的流光如何工作开始. 在一个正常的流光应用程序, 您编写的所有python代码都是顺序执行的, 从上到下. 当用户与页面上的小部件进行交互时.调用Rerun()时,整个页面将排队从上到下重新加载. 如果使用小部件来设置变量, 在重新运行之前,该变量不会获取其小部件的值.
http://moser-blog-fragment-example-1.streamlit.app/
图片显示了一条线在流光代码上,显示了流光代码通常是如何运行的.
动机
Streamlit的默认行为在大多数情况下运行良好. 然而, 在某些情况下,对小部件的每次更新都重新运行整个页面对于程序的目的来说可能太慢或效率太低. 以下是Streamlit中由于默认行为而难以创建或使用的一些示例.
动态形式
在Streamlit中,表单批处理小部件输入,以便与单个按钮同步. 这提供了一种让用户输入一系列条目而不触发多次页面重新运行的方法, 节省了用户的时间和处理能力. 然而, forms are not dynamic; the values stored in the widgets before the form submit button is pressed cannot be read. 这意味着不可能进行实时输入验证, 例如,锁定提交按钮,直到填写完表单中所有必需的字段.
http://moser-blog-app-example-dynamic-form.streamlit.app/
一个Streamlit程序,它显示了两个表单:一个是静态表单,只在用户提交后验证用户输入, 导致糟糕的用户体验, 另一个表单在用户的表单输入有效时动态启用提交按钮, 带来更好的用户体验
图形
图形是显示信息的好方法, Streamlit提供了许多方法来创建各种图形和图表来解释你的数据. 然而, 每次页面运行生成多个图形可能会相当费力,并且会大大降低应用程序的速度. 可以缓存图形,只生成一次, 但是在显示的数据可能发生变化的情况下, 或者图形需要适应用户输入的地方, 缓存不能解决这个问题.
数据流
有时, 应用程序需要不断获取数据,以便为用户提供尽可能最新的信息. Streamlit提供了一种将数据库结果缓存一段时间的方法, but there is no method of forcing the page to use these updated values automatically; a page rerun must be triggered to update the data. 一个潜在的解决方案是利用时间.Sleep()以固定间隔触发重新运行, 但这将导致重新运行整个页面以刷新数据. 如果mg官方游戏中心能将这个重新运行的范围限定为只影响需要重新加载的数据,那就太好了, 但默认流光行为, 似乎不可能.
输入的片段
Fragments通过定义特定的函数来改变Streamlit的默认行为,这些函数可以独立于页面的其余部分重新运行. 这意味着应用中需要不断反映新数据的部分可能会以固定的速率重新加载, 或者应用程序中需要大量用户输入的部分可以与页面的其余部分分开,以增加加载时间. 虽然片段有很多好处,但如果配置不当,它们也会导致奇怪的行为. 让mg官方游戏中心来看看Streamlit将如何处理带有片段的程序的不同区域中的用户输入.
里面的片段
当从片段内部触发重新运行时,该片段将排队等待重新运行. 在片段中定义的任何普通Python变量都会被重置, 并且更新会话状态变量. 片段之外的小部件将不会被更新, 即使分配其属性的会话状态变量被更改.
外面的片段
当从片段外部触发重新运行时,整个页面将正常重新运行. 所有python变量被重置,会话状态变量的值被更新. 片段不受页面其余部分更新的保护. 片段只保护页面的其余部分不受其内部更新的影响.
http://moser-blog-fragment-example-3.streamlit.app/
一个流灯光应用程序,展示了在包含片段的流灯光应用程序的不同部分触发重播如何影响应用程序的其余部分.
定义片段
你可以使用@st装饰器在代码中定义一个片段.experimental_片段. 这个装饰器只有一个参数:run_every. 该参数默认为None,用于定义片段自动重新加载的时间间隔. 这用于来自数据库、API或其他数据存储的流数据. " run_every "可以是Int或Float类型,表示两次运行之间的秒数, 一个字符串,可以转换为带有Pandas的Timedelta对象,如“2h”或“3天”。, 或Timedelta对象. When run_every is none, the 片段 will never automatically refresh; only a user input or a st.调用Rerun()将刷新片段.
@st.experimental_片段 (run_every = 5) def random_number_片段 (): st.这段代码将每5秒重新运行一次!") st.按钮(“点击手动触发重新加载!") st.度量(“最近的随机数”,随机的.randint (0, 99)) random_number_片段 ()
结论
到目前为止,您应该更清楚地掌握了片段在Streamlit中的操作方式. mg官方游戏中心已经走过了流光如何工作没有碎片, 添加片段如何改变它的行为, 以及如何在你的流光项目中定义片段. 有了这些知识, 你现在有更好的装备来提升你的流光技能和工艺迷人, 交互式应用程序. 无论您是经验丰富的开发人员还是刚刚起步, 将片段集成到Streamlit工具包中,为创建动态和引人入胜的用户体验开辟了令人兴奋的可能性. 所以,继续,实验,并把你的想法与流光的多功能功能的生活!
到现在为止, 很明显,片段s允许开发者增强Streamlit的正常功能,并创建更复杂的应用程序. 没有片段s,复杂的Streamlit应用程序可能会遇到问题,变得缓慢或不可用. Fragments允许更快地开发这些高级程序, 跑得更快, 表现得比其他方式更好. 而片段一开始可能会导致会话状态的意外行为, 这种交互很容易在第二眼看懂. Fragments使开发人员能够充分利用Streamlit的潜力, 确保开发人员的应用程序实现最佳性能和功能.
更新:7/29/2024
随着Streamlit 1的发布.2024年7月25日,碎片发生了变化,不再是一个实验特征. 因此,定义片段的语法发生了变化.
旧的语法
@st.experimental_片段 (run_every =“4 s”) def this_is_a_片段 (): st.这是一个片段的内部!")
新语法
@st.片段(run_every =“4 s”) def this_is_a_片段 (): st.这是一个片段的内部!")
最大的变化是装饰器“@st.Experimental_片段已被替换为“@st”.片段”. 旧的实验装饰器已弃用,将于2025年1月1日拆除. 另一个重要的变化是“st.通过将关键字参数“scope”设置为“片段”,现在可以将“Rerun”的作用域限定为只重新运行它内部的片段。. 这将使重新运行片段变得更加简单,而无需重新运行整个页面.
st.rerun(scope="片段") #这只会重新运行它所在的片段 st.rerun() #这将重新运行整个应用
片段仍然具有与撰写本文时相同的功能. 片段的背景和目的没有改变. 碎片现在比以前更有用了.
链接到其他Moser网页
http://bwr1.chalakseir.com/blog/creating-a-web-app-with-snowflake-and-streamlit
参考文献
包括文章中引用的Moser网站以外的任何链接:
http://trends.谷歌.com/trends/explore?日期=所有&q = streamlit&hl = en
http://docs.streamlit.io/develop/api-reference/execution-flow/st.fragment
http://docs.streamlit.io/develop/concepts/architecture/fragments
接触莫泽 今天针对贵公司的技术需求.