当前位置: 首页 > news >正文

Gradio 自定义组件

如何使用 Gradio 自定义组件,Gradio 前端使用 Svelte,后端使用的 Python。如何自定义一个组件呢?Gadio 提供了类似于脚手架的命令,可以生成需要开发组件的前后和后端代码。

创建组件

运行如下命令,gradio 会自动生成 MyComponent 目录。

gradio cc create MyComponent --template SimpleTextbox

在这里插入图片描述
重要的是两个目录,frontend(前端) 和 backend(后端)。打开 mycomponent.py,包括两个主要的方法,preprocess、postprocess,preprocess 处理前端发送到后端时的数据进行处理,postprocess 处理返回到前端的数据。
在这里插入图片描述
前端包括两个文件,Index.svelte 和 Example.svelte,Index 是组件内容,Example 是显示示例数据的 UI,Example 分为两种,包括 table 和 gallery,Table 用于显示多个数据,Gallery 用于显示单个数据。例如我们在页面加两个Input,在 index.svelte 中添加新加一个 input,数据结构从字符串改为字典。

在这里插入图片描述

<svelte:options accessors={true} /><script lang="ts">import type { Gradio } from "@gradio/utils";import { BlockTitle } from "@gradio/atoms";import { Block } from "@gradio/atoms";import { StatusTracker } from "@gradio/statustracker";import type { LoadingStatus } from "@gradio/statustracker";import { tick } from "svelte";export let gradio: Gradio<{change: never;submit: never;input: never;clear_status: LoadingStatus;}>;export let label = "Textbox";export let elem_id = "";export let elem_classes: string[] = [];export let visible = true;export let value = {"name":"a1", "addr":"bj"};export let value1 = "";export let placeholder = "";export let show_label: boolean;export let scale: number | null = null;export let min_width: number | undefined = undefined;export let loading_status: LoadingStatus | undefined = undefined;export let value_is_output = false;export let interactive: boolean;export let rtl = false;let el: HTMLTextAreaElement | HTMLInputElement;const container = true;function handle_change(): void {gradio.dispatch("change");if (!value_is_output) {gradio.dispatch("input");}}async function handle_keypress(e: KeyboardEvent): Promise<void> {await tick();if (e.key === "Enter") {e.preventDefault();gradio.dispatch("submit");}}$: if (value === null) value = {"name":"a1", "addr":"bj"};$: if (value1 === null) value1 = "";// When the value changes, dispatch the change event via handle_change()// See the docs for an explanation: https://svelte.dev/docs/svelte-components#script-3-$-marks-a-statement-as-reactive$: value, handle_change();
</script><Block{visible}{elem_id}{elem_classes}{scale}{min_width}allow_overflow={false}padding={true}
>{#if loading_status}<StatusTrackerautoscroll={gradio.autoscroll}i18n={gradio.i18n}{...loading_status}on:clear_status={() => gradio.dispatch("clear_status", loading_status)}/>{/if}<label class:container><BlockTitle {show_label} info={undefined}>{label}</BlockTitle><inputdata-testid="textbox"type="text"class="scroll-hide"bind:value={value.name}{placeholder}disabled={!interactive}dir={rtl ? "rtl" : "ltr"}on:keypress={handle_keypress}/><inputdata-testid="textbox"type="text"class="scroll-hide"bind:value={value.addr}{placeholder}disabled={!interactive}dir={rtl ? "rtl" : "ltr"}on:keypress={handle_keypress}/></label>
</Block><style>label {display: block;width: 100%;}input {display: block;position: relative;outline: none !important;box-shadow: var(--input-shadow);background: var(--input-background-fill);padding: var(--input-padding);width: 100%;color: var(--body-text-color);font-weight: var(--input-text-weight);font-size: var(--input-text-size);line-height: var(--line-sm);border: none;}.container > input {border: var(--input-border-width) solid var(--input-border-color);border-radius: var(--input-radius);}input:disabled {-webkit-text-fill-color: var(--body-text-color);-webkit-opacity: 1;opacity: 1;}input:focus {box-shadow: var(--input-shadow-focus);border-color: var(--input-border-color-focus);background-color: red;}input::placeholder {color: var(--input-placeholder-color);}
</style>

在这里插入图片描述

编译 & 发布

## 编译
gradio cc build
## 组件会发布到 Pypi,通过 Pip 进行安装
gradio cc publish

总结

Gradio 组件使用起来很方便,前端使用的是 Svelte,和 Vue 很像,入门的门槛也不高。同时,也可以引入其他三方类库,例如 tailwindcss 等等。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 三天搞了7000,AI绘本副业赚钱新途径,抓住绘本创业,轻松开启副业
  • PostgreSQL 主从的进程和Oracle dataguard的进程对比介绍
  • 计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档
  • [Redis][Zset]详细讲解
  • PHP转Go很丝滑开发框架设计思路-把php优秀设计借鉴到Go框架设计里面-保留php开发习惯又能提供高软件性能
  • 主流的消息队列
  • Java语言的Springboot框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码
  • 极狐GitLab 17.4 升级指南
  • 2024年一区极光优化+分解+深度学习!VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测
  • 研究生三年概括
  • 【实战篇】join语句怎么优化?
  • [leetcode]216_组合总和III_给定数字范围且输出无重复
  • uni-app - - - - - 实现锚点定位和滚动监听功能(滚动监听功能暂未添加,待后续更新)
  • 后端Java-SpringBoot整合MyBatisPlus步骤(超详细)
  • ubuntu下载安装部署docker,ubuntu下载最新的docker
  • .pyc 想到的一些问题
  • Angular 4.x 动态创建组件
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • es6要点
  • java中具有继承关系的类及其对象初始化顺序
  • PHP那些事儿
  • Redash本地开发环境搭建
  • SQL 难点解决:记录的引用
  • STAR法则
  • Swift 中的尾递归和蹦床
  • 分类模型——Logistics Regression
  • -- 数据结构 顺序表 --Java
  • 怎样选择前端框架
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Semaphore
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​flutter 代码混淆
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #{}和${}的区别?
  • #define用法
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)springboot教学评价 毕业设计 641310
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十六)串口UART
  • (四)stm32之通信协议
  • (一)WLAN定义和基本架构转
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET MVC第三章、三种传值方式
  • .net web项目 调用webService
  • .NET 给NuGet包添加Readme
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET分布式缓存Memcached从入门到实战
  • .net快速开发框架源码分享
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)