在Gradio实现分栏、分页的效果(二)

news2025/1/11 14:03:52

继续【Gradio的重要函数以及一些代码示例学习(一)】


1 fastapi+gradio的联合使用:mount_gradio_app

1.1 mount_gradio_app一个页面两个模块

分页的效果实现,主要依靠mount_gradio_app,启发于:Support multiple pages in a gradio app

from fastapi import FastAPI
from fastapi.responses import HTMLResponse
import gradio as gr

app = FastAPI()

HELLO_ROUTE = "/hello"
GOODBYE_ROUTE = "/goodbye"
iframe_dimensions = "height=300px width=1000px"

index_html = f'''
<h1>Put header here</h1>

<h3>
You can mount multiple gradio apps on a single FastAPI object for a multi-page app.
However if you mount a gradio app downstream of another gradio app, the downstream
apps will be stuck loading. 
</h3>

<h3>
So in particular if you mount a gradio app at the index route "/", then all your 
other mounted gradio apps will be stuck loading. But don't worry, you can still embed
your downstream gradio apps into the index route using iframes like I do here. In fact,
you probably want to do this anyway since its your index page, which you want to detail 
more fully with a jinja template. 
For a full example, you can see my <a href=https://yfu.one/>generative avatar webapp</a>
</h3>

<div>
<iframe src={HELLO_ROUTE} {iframe_dimensions}></iframe>
</div>

<div>
<iframe src={GOODBYE_ROUTE} {iframe_dimensions}></iframe>
</div>

'''

@app.get("/", response_class=HTMLResponse)
def index():
    return index_html


hello_app = gr.Interface(lambda x: "Hello, " + x + "!", "textbox", "textbox")
goodbye_app = gr.Interface(lambda x: "Goodbye, " + x + "!", "textbox", "textbox")


app = gr.mount_gradio_app(app, hello_app, path=HELLO_ROUTE)
app = gr.mount_gradio_app(app, goodbye_app, path=GOODBYE_ROUTE)

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app)
    
    

此时通过mount_gradio_app在fastapi同时部署两个模块,来看一下例子:
在这里插入图片描述

1.2 mount_gradio_app两个页面两个模块

启发于:230902-部署Gradio到已有FastAPI及服务器中

import gradio as gr


def greet(text: str) -> str:
    return text


demo1 = gr.Interface(
    fn=greet,
    inputs=gr.components.Textbox(label='Input-1'),
    outputs=gr.components.Textbox(label='Output-1'),
    allow_flagging='never'
)

demo2 = gr.Interface(
    fn=greet,
    inputs=gr.components.Textbox(label='Input-2'),
    outputs=gr.components.Textbox(label='Output-2'),
    allow_flagging='never'
)



from fastapi import FastAPI
import gradio as gr



app = FastAPI()

@app.get('/')
async def root():
    return 'Gradio app is running at /gradio', 200

app = gr.mount_gradio_app(app, demo1, path='/gradio1')
app = gr.mount_gradio_app(app, demo2, path='/gradio2')

import uvicorn
uvicorn.run(app)

这里定义了两个gradio模块,demo1demo2,通过mount_gradio_app,映射到两个子路径,gradio1gradio2
所以这里,需要通过http://127.0.0.1:8000/gradio2/http://127.0.0.1:8000/gradio1/ 到达两个页面:
在这里插入图片描述


2 TabbedInterface组件进行选项卡布局

官方教程:tabbedinterface

启发于:Gradio使用介绍 和 优雅组合,高效交互:Gradio Combining Interfaces模块解析
TabbedInterface可以通过提供一个Interface列表来创建,每个Interface都会在一个单独的选项卡中显示。您可以根据需要为每个选项卡指定名称,也可以使用默认的"Tab 1"、"Tab 2"等名称。
几个参数的构成:
在这里插入图片描述

2.1 Parallel:并行比较案例

Parallel可以将多个接口并行比较它们的输出。要将接口放在Parallel中,它们必须共享相同的输入组件,但可以有不同的输出组件。

import gradio as gr

greeter_1 = gr.Interface(lambda name: f"Hello {name}!", inputs="textbox", outputs=gr.Textbox(label="Greeter 1"))
greeter_2 = gr.Interface(lambda name: f"Greetings {name}!", inputs="textbox", outputs=gr.Textbox(label="Greeter 2"))
demo = gr.Parallel(greeter_1, greeter_2)

if __name__ == "__main__":
    demo.launch()

在这里插入图片描述
可以看到一个输入,两个输出

2.2 Series:串行连接

Series可以将多个接口串行连接在一起,将一个接口的输出作为下一个接口的输入。要使用Series,接口之间的输入和输出组件必须匹配。

示例用法:

import gradio as gr

get_name = gr.Interface(lambda name: name, inputs="textbox", outputs="textbox")
prepend_hello = gr.Interface(lambda name: f"Hello {name}!", inputs="textbox", outputs="textbox")
append_nice = gr.Interface(lambda greeting: f"{greeting} Nice to meet you!",
                           inputs="textbox", outputs=gr.Textbox(label="Greeting"))
demo = gr.Series(get_name, prepend_hello, append_nice)

if __name__ == "__main__":
    demo.launch()

在这里插入图片描述
两个组件可以联动

2.3 第三个TabbedInterface的案例:

import gradio as gr
css = """
#warning {background-color: #FFCCCB}
.feedback textarea {font-size: 24px !important}
"""
 
with gr.Blocks(css=css) as demo1:
    with gr.Row():
        with gr.Column(scale=1):
            gr.Textbox(label="name", elem_id="warning")
            gr.Textbox(label="age", elem_classes="feedback")
        with gr.Column(scale=2):
            gr.Dropdown(["one", "two", "tree"], label="class")
            gr.CheckboxGroup(["male", "female"], label="sex")
        with gr.Column(scale=1):
            gr.Radio(["is_girl"], label="is_girl")
            gr.Slider(1, 100, 20)
    with gr.Row():
        gr.Button(value="Submit")
        gr.Button(value="Clear")


with gr.Blocks(css=css) as demo2:
    with gr.Row():
        with gr.Column(scale=1):
            gr.Textbox(label="name", elem_id="warning")
            gr.Textbox(label="age", elem_classes="feedback")
        with gr.Column(scale=2):
            gr.Dropdown(["one", "two", "tree"], label="class")
            gr.CheckboxGroup(["male", "female"], label="sex")
        with gr.Column(scale=1):
            gr.Radio(["is_girl"], label="is_girl")
            gr.Slider(1, 100, 20)
    with gr.Row():
        gr.Button(value="Submit")
        gr.Button(value="Clear")


app = gr.TabbedInterface([demo1, demo2], ["First", "Second"])
app.launch()

如果应用的并发流量很大,gradio还提供排队处理机制,在demo.queue()中可以指定并发处理数量,例如

with gr.Blocks() as demo:
    #...
demo.queue(concurrency_count=3)
demo.launch()

最终的效果为:
在这里插入图片描述
可以看到最上面有两个选项可以选择不同的控件组成

3 未测试

分页的效果实现,主要依靠mount_gradio_app,启发于:Support multiple pages in a gradio app

import gradio as gr

gr.Blocks():
  gr.Page("My amazing page", route="/"):
    gr.Markdown("# My amazing page")
    gr.Textbox("Page one")
  gr.Page("My second amazing page", route="/page-two"):
    gr.Markdown("# My second amazing page")
    gr.Textbox("Page two")

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

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

相关文章

edge浏览器无法进入中国知网,但可以进入其他网站需要怎么解决

最近使用edge浏览器进入中国知网&#xff0c;加载了很长时间都打不开&#xff0c;好不容易打开了&#xff0c;结果出现&#xff1a;“嗯...无法访问此页面”。即使无法进入知网&#xff0c;但可以进入哔哩哔哩或其他网站&#xff0c;甚是苦恼&#xff0c;下面是一个方法&#x…

谷歌护眼插件Dark Reader下载安装使用

网盘下载地址 链接&#xff1a;https://pan.baidu.com/s/1S086F-9aogPT1NJ2NoUqdw 提取码&#xff1a;ii29使用 前提&#xff1a;只对于谷歌用户&#xff1a; 1、下载后解压获得&#xff1a;Dark Reader v4.9.65.0.crx 2、然后把后缀改成.zip 3、再次解压出文件 4、然后把里…

在Spring Boot中使用MyBatis访问数据库

MyBatis&#xff0c;这个对各位使用Java开发的开发者来说还是蛮重要的&#xff0c;我相信诸位在企业开发项目的时候&#xff0c;大多数采用的是Mybatis。使用MyBatis帮助我们解决各种问题&#xff0c;实际上这篇文章&#xff0c;基本上默认为可以跳过的一篇&#xff0c;但是为了…

修改Launcher3 图标为圆角

packages\apps\Launcher3\res\xml\folder_shapes.xml packages\apps\Launcher3\src\com\android\launcher3\graphics\IconShape.java 上述文件的解析在 IconShape中 private static List<IconShape> getAllShapes(Context context) {ArrayList<IconShape> resul…

13.求面积[有问题]

#include<stdio.h> #include<math.h> #include<bits/stdc.h> using namespace std;void fun(double a,b,c) {double p,c;p (abc)/2;c sqrt(p*(p-a)*(p-b)*(p-c));printf("面积是&#xff1a;%lf",c); }int main(){double a,b,c;scanf("%lf,%…

OOM排查

OOM排查 一&#xff0c;原因 1.一次性申请对象太多&#xff0c;创建了大量对象&#xff0c;尤其从表中读取了大量数据&#xff0c;循环中大量创建对象&#xff0c;放入list中。方案&#xff1a;限量 2.内存资源耗尽为释放&#xff0c;如connction&#xff0c;线程。方案&#…

margin-bottom、margin-top设置不起效

问题&#xff1a; 如下&#xff0c;在uniapp项目中使用了tag标签&#xff0c;设置margin时&#xff0c;只有margin-left、margin-right生效&#xff0c;margin-bottom、margin-top设置不起效。f12直接在元素中修改也无效。 原因&#xff1a; uni-ui中的tag标签是行内元素&…

个人所得税思维导图参考 —— 筑梦之路

最近个人所得税优惠政策又有新变化&#xff1a; 1. 自2023年1月1日至2027年12月31日&#xff0c;对个体户年应纳税所得额不超过200万元的部分&#xff08;旧&#xff1a;不超过100万元的部分&#xff09;&#xff0c;减半征收个人所得税&#xff1b; 2. 适用个人所得税优惠政策…

自动化测试(Java+eclipse)教程

webdriver环境配置 1.下载chromedriver到本地&#xff08;一定要选择和自己浏览器相对应的版本chromedriver下载地址&#xff09; 2.加入到环境变量path中 webdriver工作原理 创建web自动化测试脚本 1.Maven项目创建 File->New->project->(搜索maven)选择maven pr…

Leetcode-面试题 02.02 返回倒数第 k 个节点

快慢指针&#xff1a;让快指针先移动n个节点&#xff0c;之后快慢指针一起依次向后移动一个结点&#xff0c;等到快指针移动到链表尾时&#xff0c;慢指针则移动到倒数第n个结点位置。 /*** Definition for singly-linked list.* public class ListNode {* int val;* …

【Linux】初识进程地址空间

❤️前言 大家好&#xff01;这里是好久没有营业的大懒虫lion&#xff0c;今天要和大家聊的内容是我最近新学习的关于进程地址空间的相关知识。 正文 当我们使用C/C语言进行内存管理时&#xff0c;经常会接触到这样的一张图片&#xff1a; 它常常被我们称作程序地址空间&#…

代码都成屎山了,还在用if-else?不如试试我的这套工厂模式+Map+自定义注解+枚举

前言 看到同事的代码&#xff0c;想到多年以前自己刚开始工作的时候写的代码&#xff0c;即使有再多的需求&#xff0c;再多的业务逻辑&#xff0c;都是满屏的if-else解决的&#xff0c;全然忘记什么叫做“面向对象编程”&#xff0c;但是写的多了都忘记了哪里是头&#xff0c;…

OAuth 2.0实现统一认证

OAuth 2.0协议概念&#xff1a; OAuth 是 Open Authorization 的简写。OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 OAuth 的授权不会使第三方触及到用户的帐号信息&#xff08;如用户名与密码&#xff09;&#xff0c;即第…

MIPI/DSI转eDP新选择CS5523芯片替代LT8911EXB,IT6151

ASL&#xff08;集睿致远&#xff09; CS5523 是一颗 MIPI DSI 输入&#xff0c;DP/eDP 输出转换芯片。MIPI 输入 4 lanes, 每 lane 最大支持 1.5Gbps&#xff0c; DP/eDP 输出最多支持 4 lanes, 每条 lane 最大支持 2.7Gbps。 芯片内部有一个 MCU &#xff0c;自带 flash。 …

计算机网络期末复习-Part2

1、网络应用程序体系结构 &#xff08;1&#xff09;客户端/服务器&#xff08;C/S&#xff09;体系结构&#xff1a; 客户端/服务器&#xff08;C/S&#xff09;应用程序&#xff1a; Web浏览器与Web服务器&#xff1a;当您使用Web浏览器&#xff08;客户端&#xff09;访问…

Vue3 学习笔记

vue3 官网&#xff1a;简介 | Vue.js (vuejs.org) 1. 环境搭建与启动 npm create vuelatest 这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具 之后&#xff0c;你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示&#xff1a; ✔ …

Flutter的专属Skia引擎解析+用法原理

Skia是一款跨平台的2D图形库&#xff0c;是Google公司开发的&#xff0c;可以用于开发各种应用程序&#xff0c;如浏览器、游戏、移动应用程序等。Skia引擎的主要特点是速度快、可移植性强、占用的内存少、稳定性佳&#xff0c;适用于多种硬件平台。 Skia的目标是提供快速、高…

Java SE 25居然有8年的Premier Support !

今天偶然间看了一下Oracle官网发布的Java SE路线图&#xff0c;发现Java 25赫然在列&#xff0c;并且Premier Support居然长达8年&#xff01;上一个有这么长支持的版本还是Java 8。Java 17&#xff08;LTS&#xff09;和Java 21&#xff08;LTS&#xff09;算上Extended Suppo…

鸿蒙开发工具DevEco Studio的下载和安装

一、DevEco Studio概述 1、简介 HUAWEI DevEco Studio&#xff08;获取工具请单击链接下载&#xff0c;以下简称DevEco Studio&#xff09;是基于IntelliJ IDEA Community开源版本打造&#xff0c;为运行在HarmonyOS和OpenHarmony系统上的应用和服务&#xff08;以下简称应用…

计算机中丢失mfc140u.dll怎么解决

mfc140u.dll是一个Microsoft Visual C库文件&#xff0c;主要用于MFC&#xff08;Microsoft Foundation Class&#xff09;应用程序的开发。它包含了MFC应用程序所需的一些常用功能&#xff0c;如对话框、窗口、菜单等。当mfc140u.dll丢失时&#xff0c;可能会导致MFC应用程序无…