Streamlit自定义组件开发教程

news2024/11/17 0:33:15

在这篇文章中,我们将学习如何构建Streamlit组件以及如何发布streamlit组件供其他人使用。
在这里插入图片描述

使用 3D场景编辑器快速搭建三维数字孪生场景

1、什么是Streamlit组件?

Streamlit 组件是一个可共享的 Streamlit 插件,可让你为应用程序添加新的视觉效果和交互性。

为什么要使用或构建Streamlit组件?

因为尽管 Streamlit 具有大量内置功能,但有时你可能希望向 Streamlit(尚)不可用的应用程序添加可视化或交互性,然后与社区共享。

有三种类型的组件:

  • 仅限 Python 的组件:不需要自定义 HTML/JavaScript 的 Python 代码。
  • 静态组件:Python + HTML/JavaScript,可以嵌入到你的应用程序中。
  • 双向组件:Python + HTML/JavaScript,可以嵌入到你的应用程序中,并且可以将数据返回给它。

想知道要构建哪些组件?以下是一些思路:

  • 在 Streamlit 中不可用的新 baseweb 组件。
  • 一个可点击的图表,可让你在应用中使用点击的值。
  • 一个文本输入框,在你键入时返回值 - 不需要“输入”(这就是我们将在本文中共同构建的内容)。
  • 查看社区组件跟踪器,了解已经构建了哪些类型的组件。

2、Streamlit组件开发#1 — 创建样板代码

Cruft 为你提供预先存在的项目模板。可以使用 pip、pipx 或 brew 安装它,然后运行以下命令:

cruft create https://github.com/blackary/cookiecutter-streamlit-component/

接下来,输入组件的详细信息:

author_name [Bob Smith]: Zachary Blackwood
author_email [bob@example.com]: example@example.com            
project_name [Streamlit Component X]: Streamlit Keyup
package_name [streamlit-keyup]: streamlit-keyup
import_name [streamlit_keyup]: st_keyup 
description [Streamlit component that allows you to do X]: A streamlit component that allows you to get input from a textbox after every key press
deployment_via_github_actions [y]: y
Select open_source_license:
1 - MIT license
2 - BSD license
3 - ISC license
4 - Apache Software License 2.0
5 - GNU General Public License v3
6 - Not open source
Choose from 1, 2, 3, 4, 5, 6 [1]: 1

注意:可以随心所欲地调用你的组件。但是,如果你希望它可以通过GitHub操作轻松地在PyPI上发布,请在deployment_via_github_actions问题中输入y。这是默认值,因此在必须接受它时按下即可。

此模板将创建以下目录结构:

streamlit-keyup
├── .cruft.json
├── .github
│   └── workflows
│       └── publish_PYPI_each_tag.yml
├── .gitignore
├── LICENSE
├── MANIFEST.in
├── README.md
├── requirements.txt
├── setup.py
└── src
    └── st_keyup
        ├── __init__.py
        └── frontend
            ├── index.html
            ├── main.js
            ├── streamlit-component-lib.js
            └── style.css

如果要将这个包作为 streamlit-keyup 发布,则会生成此布局,因此这些是 package_name 和 import_name 的值。

3、Streamlit组件开发#2 — 添加基本网页

Cruft将创建一个html文件 src/st_keyup/frontend/index.html 。

只需在 <body>中添加新标签:

<body>
  <div id="root">
    <label id="label" for="text_input">This is a label</label>
    <div class="input">
	  <input type="text" name="text_input" id="input_box" />
    </div>
  </div>
</body>

接下来运行:

streamlit run src/st_keyup/__init__.py

由于样板文件 init.py 包含一些内容,因此你将看到以下输出:
在这里插入图片描述

没什么神奇的,但我们实现了最基本的streamlit组件!

4、Streamlit组件开发#3 — 添加 JS交互代码

frontend/ 文件夹中有一个 main.js 文件,其中包含大多数标准代码。只需要在 onRender 函数和 if (!window.rendered) 块中添加代码。

代码将执行以下操作:

1、获取用户在使用组件时指定的值( label和 value):

const {label, value} = event.detail.args;

2、从 HTML 页面中获取 <label>标签,并将文本设置为用户设定的值:

const label_el = document.getElementById("label")
label_el.innerText = label

3、从 HTML 页面获取 <input> 标签,如果用户为输入指定了默认值,则将起始值设置为该值:

const input = document.getElementById("input_box");
if (value) {
  input.value = value
}

4、当 <input>标签出现 keyup事件时,意味着用户按下键,将当前输入值发送回组件:

input.onkeyup = event => sendValue(event.target.value)

最终的 onRender 函数将如下所示:

function onRender(event) {
  // Only run the render code the first time the component is loaded.
  if (!window.rendered) {
    // Grab the label and default value that the user specified
    const {label, value} = event.detail.args;

    // Set the label text to be what the user specified
    const label_el = document.getElementById("label")
    label_el.innerText = label

    // Set the default value to be what the user specified
    const input = document.getElementById("input_box");
    if (value) {
      input.value = value
    }

    // On the keyup event, send the new value to Python
    input.onkeyup = event => sendValue(event.target.value)

    window.rendered = true
  }
}

5、作为额外的步骤,在脚本结束时将组件的高度设置为 85px:

Streamlit.setFrameHeight(85)

目前Python 代码还没有正确传递标签和值。再次运行应用并在输入框中键入,可以看到 JavaScript 将键入的值传递回 Streamlit:

Recording-2022-09-15-at-16.38.18

马上就要成功了!

5、Streamlit组件开发#4 — 设置 Python 代码

要正确指定标签和值,需要更新 src/st_keyup/init.py 中的 st_keyup函数:

def st_keyup(
    label: str,
    value: Optional[str] = "",
    key: Optional[str] = None,
):
    """
    Create a Streamlit text input that returns the value whenever a key is pressed.
    """
    component_value = _component_func(
        label=label,
        value=value,
        key=key,
        default=value
    )

    return component_value

要使你的演示 Streamlit 应用程序正常工作,请更新 main 函数:

def main():
    st.write("## Example")
    value = st_keyup("This is a label!")

    st.write(value)

    st.write("## Example with value")
    value2 = st_keyup("With a default value!", value="Default value")

    st.write(value2)

运行 streamlit run src/st_keyup/init.py,你会看到如下结果:

在这里插入图片描述

接近完美的Streamlit组件!

不过我们希望它看起来像内置的streamlit文本框?让我们给它添加一些 CSS。

6、Streamlit组件开发#5 — 添加 CSS样式

摆弄 CSS 可能需要一段时间。您可以使用浏览器的 DevTools 将Streamlit内置组件 st.text_input 中的 CSS 复制到你的 style.css 文件中,可参阅此处的最终 CSS 示例。

添加我们的css样式文件并重新加载页面。应用将如下所示:

在这里插入图片描述

7、发布Streamlit组件

为自己创建一个streamlit组件很有趣,但将其发布为 PyPI 包更有用。有一个名为 .github/workflows/publish_PYPI_each_tag.yml 的文件,它会通知 GitHub 每次发布新版本时都会将最新版本的包发布到 PyPI。

以下是实现方法:

第 1 步,将代码推送到 GitHub。

前往 github阅读有关如何创建新存储库的说明。不要添加README、.gitignore 或许可协议,因为存储库中已经有这些文件了。

第 2 步,创建 PyPI 帐户并创建 API 令牌
转到 pypi.org 并创建一个帐户,然后转到api-tokens并为此项目创建新的 API 令牌。复制 API 密钥,转到存储库的设置并选择 secrets:

在这里插入图片描述

如创建 API 密钥时 PyPI 说明中所述,将 PYPI_USERNAME设置为 token 并将令牌值放在 PYPI_PASSWORD中。

第 3 步,在 GitHub 上创建一个发布,它将触发对 PyPI 的发布。

在存储库的右侧,单击“Releases”链接,然后单击“Draft a New Release”,然后选择一个标记。在你的 setup.py 中,版本设置为 0.1.0,因此请在发布标记前面加上 v,例如 v0.1.0。

第 4 步,转到“Actions”选项卡以查看发布是否成功,然后进行测试!

如果初始版本已成功发布,你将看到如下所示的内容:

在这里插入图片描述

要测试它是否有效,请转到 pypi.org 并查找新包。然后尝试 pip install <your-package-name>

💡注意:你将无法在 PyPI 上发布同名的包(因为我已经这样做了),但是当发布自己的组件时,这应该可以工作。如果要测试发布此包(或虚拟包),请在 setup.py 中更改名称,并在 test.pypi.org 上使用帐户而不是 pypi.org。在此处阅读有关使用 test.pypi.org 的更多信息。

8、额外提示

  • 不要忘记在每次发布新版本时更新 setup.py 中的版本。
  • 拥有 GitHub 存储库后,在 setup.py 中添加指向它的 URL 参数。
  • 将 streamlit-component标记添加到 GitHub 存储库。
  • 在论坛上公布你的streamlit组件。

9、结束语

现在你知道如何制作第一个streamlit组件了!希望它能激励你创建更多streamlit组件,并继续使 Streamlit 成为构建各种应用程序的更好工具。


原文链接:Streamlit组件开发教程 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java——子集

题目链接 leetcode在线oj题——子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 题目示例 输入&#xff1a;nums [1,2,3] …

MySQL管理

1&#xff1a;MySQL管理1.1&#xff1a;系统数据库Mysql数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xff1a; 数据库 含义 mysql 存储MySQL服务器正常运行所需要的各种信息 &#xff08;时区、主从、用 户、权限等&#xff09; information…

性能测试/实战演示 H5 性能分析

W3C标准是浏览器标准&#xff0c;一般浏览器都支持W3C标准&#xff0c;它规定使用者可以通过api查询性能信息&#xff0c;可借用W3C协议完成自动化H5性能测试。 W3C官网&#xff1a;Navigation Timing 使用chrome浏览器对webview进行手工查看&#xff0c;伴随着业务增多&#x…

mysql:索引的数据结构,B树,B+树浅聊

mysql&#xff1a;索引的数据结构 什么是索引&#xff1f; 索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构 为什么学索引&#xff1f; 之前应该有概念说&#xff0c;把索引理解为目录&#xff0c;比如通过s就可以查询到s开头的汉子从哪也开始&#xff…

[网鼎杯 2020 青龙组]AreUSerialz

目录 信息收集 代码审计 前提知识 思路分析 绕过检测 方法一 poc payload 方法二 poc payload 信息收集 进入页面给出了源代码如下&#xff0c;是一道PHP的反序列化题目 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {pro…

Linux多线程 线程概念 | 线程VS进程 | 线程控制【万字精讲】

线程 一、线程概念 1. 知识支持及回顾 在我们一开始学习进程的时候。我们总说进程在内部执行时&#xff0c;是OS操作系统调度的基本单位。其实并不严谨&#xff0c;今天&#xff0c;我们要重新完善这个说法——线程在进程内部运行&#xff0c;线程是OS操作系统调度的基本单位…

WorkPlus移动办公平台,助力企业随时随地“指尖办公”

近年来&#xff0c;随着移动互联网的发展&#xff0c;越来越多的人习惯于随时随地通过移动设备完成工作、购物、游戏等。移动办公应用就是基于移动终端的信息化办公应用&#xff0c;利用企微、钉钉、WorkPlus等移动办公平台&#xff0c;实现企业与员工间的随时随地工作、沟通&a…

技术分享 | ClickHouse StarRocks 使用经验分享

作者&#xff1a;许天云 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 一. 大纲 本篇分享下个人在实时数仓方向的一些使用经验&#xff0c;主要包含了ClickHouse 和 StarRocks 这两款目…

ASP.NET MVC解决方案的搭建(.NET Framework)——C#系列(一)

一、新建项目 1、控制器新建 2、Service层新建 3、Business数据层新建 4、Commons公共层新建 5、Models实体层新建 二、调用接口 1、接口建立 Web API 2 控制器新建 2、调用 三、Swagger接口调试配置 1、添加NuGet包 在启动项中添加Swashbuckle NuGet包 2、访问 htt…

Vivado2018.3安装及注册指南-安装包获取

一、vivado 介绍 vivado设计套件 是FPGA 厂商赛灵思&#xff08;Xilinx&#xff09;公司最新的为其产品定制的集成开发环境&#xff0c;支持Block Design、Verilog、VHDL等多种设计输入方式&#xff0c;内嵌综合器以及仿真器&#xff0c;可以完成从设计输入、综合适配、仿真到…

mysql存储过程的基础知识

本文来简单说下存储过程的基础知识 文章目录概述什么是存储过程存储过程的优缺点概述 mysql官网提供的储存过程&#xff1a;https://www.mysqlzh.com/doc/225/499.html 什么是存储过程 简单的说&#xff0c;存储过程是一条或者多条SQL语句的集合&#xff0c;可视为批文件&…

SAP采购中不基于收货的发票校验的价差计算过程实例

年前最后一天上班了&#xff0c;我还在帮财务分析一个价差问题。源于财务用户头天的一个请求&#xff0c;在不基于收货的发票校验中&#xff0c;计算倒不难&#xff0c;难的是梳理数量的逻辑关系。不过总算时间也没白花&#xff0c;记录下来。下次就不算了&#xff0c;能解释清…

理解使用并查集

目录 一.并查集原理 1.概念&#xff1a; 2.性质 3.形式 4. 合并方式 二.并查集实现 1.成员变量 2.构造函数 3.查找根 4.合并集合 5.判断是否在一个集合 6.查看集合数量 三.并查集总代码 前言&#xff1a;理解并查集是为了接下来学习图要用&#xff0c;而会使用并查…

Linux:系统性能监控工具-tsar安装和使用

在上家公司做性能压力测试时就用过tsar&#xff0c;但总结文档留在了内部&#xff0c;正好借着最近工作内容又用上了tsar&#xff0c;总结起来 目录前言tsar介绍总体架构安装tasrtsar配置介绍配置文件定时任务配置日志文件tsar使用tsar实际使用参考查看可用的监控模块列表查看C…

本松新材创业板IPO终止:业绩下滑,客户较集中,周永松为实控人

撰稿|汤汤 来源|贝多财经 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;杭州本松新材料技术股份有限公司&#xff08;下称“本松新材”&#xff09;提交了撤回上市申请文件的申请&#xff0c;保荐人财通证券也撤回对该公司的保荐。因此&#xff0c;深交所终止了…

目标检测:YOLOV3技术详解

目标检测&#xff1a;YOLOV3技术详解前言主要改进DarkNet53新的分类器正负样本的匹配损失函数前言 YOLOV3是V2的升级版&#xff0c;也是原作者的绝笔&#xff0c;V3主要还是把当时一些有用的思想融入了进来&#xff0c;没有什么创新型的突破&#xff0c;具体细节我们下面介绍。…

【安卓逆向】Frida入门与常用备忘

【安卓逆向】Frida入门与常用备忘前置知识什么是hook&#xff1f;hook的作用常见的逆向工具Frida使用入门简介与资料参考备忘前置环境配置执行hook常用hook脚本/API前置知识 什么是hook&#xff1f; hook&#xff0c;译为“钩子”&#xff0c;是指将方法/函数勾住&#xff0c;…

2022-CSDN的一年

前言 马上要到兔年的春节&#xff0c;年前最后一个版本顺利上线&#xff0c;闲下来两天&#xff0c;可以对过往一年进行一下总结&#xff0c;说起来这是入职CSDN之后第一次自己将自己所思所想以以博客的形式发布在CSDN网站上&#xff0c;也是比较奇特的体验。语言表达能力不强&…

利用华为路由器配置单臂路由功能,实现多个vlan间通信

单臂路由&#xff0c;是通过一台路由器使不同VLAN之间互通的数据通过路由器进行三层转发。 如果在路由器上为每个 VLAN分配一个单独的路由器物理接口&#xff0c;那么随着VLAN数量的增口&#xff0c;必然需要更多的接口&#xff0c;而路由器能提供的接口数量有限&#xff0c;所…

Kubernetes 基本概念

Kubernetes 是什么 Kubernetes 是一个可移植、可扩展的开源平台。用于管理容器化的工作负载和服务&#xff0c;可促进声明式配 置和自动化。是谷歌保密了十几年的秘密武器Borg的开源版本&#xff0c;谷歌一直通过Borg系统管理着数量庞大 的应用程序集群。由于Kubernetes是基于…