【Gradio】Building With Blocks 控制布局

3e3f60c262405f1557ce8409335ecdb1.png

默认情况下,块中的组件垂直排列。让我们看看如何重新排列组件。在底层,这种布局结构使用了网页开发的 flexbox 模型。

在 with gr.Row 子句中的元素将全部水平显示。例如,要并排显示两个按钮:

with gr.Blocks() as demo:with gr.Row():btn1 = gr.Button("Button 1")btn2 = gr.Button("Button 2")

要使行中的每个元素都具有相同的高度,请使用 style 方法的 equal_height 参数。

with gr.Blocks() as demo:with gr.Row(equal_height=True):textbox = gr.Textbox()btn2 = gr.Button("Button 2")

可以通过每个组件中存在的 scale 和 min_width 参数的组合来控制行中元素的宽度。

  • scale 是一个整数,定义了元素在 Row 中占据的空间。如果 scale 设置为 0 ,元素不会扩展占据空间。如果 scale 设置为 1 或更大,元素将会扩展。Row 中的多个元素会根据它们的 scale 成比例扩展。下面, btn2 将会扩展两倍于 btn1 ,而 btn0 则根本不会扩展:

with gr.Blocks() as demo:with gr.Row():btn0 = gr.Button("Button 0", scale=0)btn1 = gr.Button("Button 1", scale=1)btn2 = gr.Button("Button 2", scale=2)
  • min_width 将设置元素的最小宽度。如果没有足够的空间满足所有 min_width 值,Row 将会换行。

https://www.gradio.app/docs/gradio/row

列和嵌套 

"在 Column 中的组件将会被垂直地放置在彼此之上。由于垂直布局本来就是 Blocks 应用的默认布局,为了发挥作用,Columns 通常会嵌套在 Rows 内。例如:

import gradio as gr  # 导入gradio库with gr.Blocks() as demo:  # 使用gr.Blocks构建应用布局with gr.Row():  # 创建一行,用于并排放置以下组件text1 = gr.Textbox(label="t1")  # 创建一个文本输入框,标签为t1slider2 = gr.Textbox(label="s2")  # 错误地将其命名为slider2,实际上是一个文本输入框,标签为s2drop3 = gr.Dropdown(["a", "b", "c"], label="d3")  # 创建一个下拉菜单,选项为a, b, c,标签为d3with gr.Row():  # 创建另一行,用于布局两个列容器with gr.Column(scale=1, min_width=600):  # 创建第一个列容器,比例为1,最小宽度600pxtext1 = gr.Textbox(label="prompt 1")  # 创建一个文本输入框,标签为prompt 1text2 = gr.Textbox(label="prompt 2")  # 创建另一个文本输入框,标签为prompt 2inbtw = gr.Button("Between")  # 创建一个按钮,标签为Betweentext4 = gr.Textbox(label="prompt 1")  # 创建第三个文本输入框,错误命名,应为text3,标签为prompt 1text5 = gr.Textbox(label="prompt 2")  # 创建第四个文本输入框,错误命名,应为text4,标签为prompt 2with gr.Column(scale=2, min_width=600):  # 创建第二个列容器,比例为2,最小宽度600pximg1 = gr.Image("images/cheetah.jpg")  # 创建一个图像显示组件,初始显示cheetah.jpgbtn = gr.Button("Go")  # 创建一个按钮,标签为Godemo.launch()  # 启动应用

这段代码使用Gradio库构建了一个具有多个输入和显示组件的Web应用布局。布局包含两行,第一行包含一个文本框、另一个被错误地称为滑块(实际上是文本框)的文本框和一个下拉菜单。第二行包括两个列容器,第一个列容器以1:2的比例展示了两个文本输入框、一个按钮和其他错误命名的文本框;第二个列容器,以更大的比例展示了一个图像和一个按钮。此代码主要展示了Gradio布局的使用,包括行、列的嵌套结构,以及如何通过设置比例和最小宽度来控制布局的响应式表现。需要注意的是,代码中存在一些命名的误区,如slider2实际上是一个文本输入框,并且后续创建的text4text5在逻辑上分别应当是text3text4。此外,应用布局构建完成后,并没有为按钮和其他组件绑定具体的动作或逻辑,这些需要在实际应用开发过程中根据需求进一步添加。

6637e5db86120336458abe49c70def1e.png

看看第一列是如何垂直排列了两个文本框。第二列垂直排列了一个图像和按钮。注意两列的相对宽度是由 scale 参数设置的。宽度是 scale 值两倍的列,其宽度也是两倍。

在文档中了解更多关于列的信息。

尺寸

您可以控制各种组件的高度和宽度,这些参数是可用的。这些参数接受一个数字(解释为像素)或一个字符串。使用字符串可以直接将任何 CSS 单位应用于封装的块元素,以满足更具体的设计要求。如果省略,Gradio 会使用适合大多数用例的默认尺寸。 

下面是一个示例,说明了视口宽度(vw)的使用:

import gradio as gr  # 导入gradio库with gr.Blocks() as demo:  # 使用gr.Blocks创建一个应用布局im = gr.ImageEditor(width="50vw",  # 设置图像编辑器的宽度为视口宽度的50%)demo.launch()  # 启动应用

代码使用Gradio库创建了一个简单的Web应用程序,其中包含一个图像编辑器组件。应用启动后,用户将看到一个可以进行基本图像编辑操作(如裁剪、调整尺寸等)的界面。通过设定width参数为"50vw",图像编辑器的宽度被设置为视图宽度的50%,"vw"是一个CSS单位,代表视口宽度的1%,这样可以确保图像编辑器的宽度相对于用户视口大小进行动态调整,以适应不同设备和屏幕尺寸。这个示例展示了Gradio的ImageEditor组件的使用方式,展现了如何快速集成一个图像编辑工具到Web应用中

当使用百分比值定义尺寸时,您可能希望用一个绝对单位(例如 px 或 vw )定义一个父组件。这种方法确保了具有相对尺寸的子组件能够适当地调整大小:

import gradio as gr  # 导入gradio库css = """
.container {height: 100vh;
}
"""  # 定义CSS样式,设置容器高度为视口高的100%with gr.Blocks(css=css) as demo:  # 使用gr.Blocks创建一个应用布局,并应用自定义CSSwith gr.Column(elem_classes=["container"]):  # 创建一个列元素,并应用自定义的.container类name = gr.Chatbot(value=[["1", "2"]], height="70%")  # 创建一个Chatbot组件,初始对话为["1", "2"],高度设为70%demo.launch()  # 启动应用

这段代码使用了Gradio库来创建一个包含Chatbot组件的Web应用。通过CSS自定义了.container类以设置容器的高度为视口高度的100%,这意味着列容器将充满整个屏幕的高度。Chatbot组件在这个容器内被创建,并设置了其高度占据容器高度的70%,初始显示的对话内容为["1", "2"]。这个示例展现了如何使用Gradio创建带有Chatbot的界面,并通过CSS对组件进行样式自定义。这对于想要在Web应用中实现聊天机器人界面的开发者来说是一个非常实用的示例。

在此示例中,Column 布局组件的高度被设置为视口高度的 100%(100vh),而其中的 Chatbot 组件占据了 Column 高度的 70%。

您可以对这些参数应用任何有效的 CSS 单位。有关 CSS 单位的综合列表,请参阅本指南https://www.w3schools.com/cssref/css_units.php 。我们建议您始终考虑响应性,并在各种屏幕尺寸上测试您的界面,以确保用户体验的一致性。

标签页和手风琴 

您也可以使用 with gr.Tab('tab_name'): 子句创建标签页。在 with gr.Tab('tab_name'): 上下文中创建的任何组件都会显示在该标签页中。连续的标签页子句会被组合在一起,这样一次只能选择一个标签页,并且只显示该标签页上下文中的组件。

例如:

import numpy as np  # 导入numpy库
import gradio as gr  # 导入gradio库def flip_text(x):  # 定义翻转文本的函数return x[::-1]  # 返回反向的字符串def flip_image(x):  # 定义翻转图像的函数return np.fliplr(x)  # 使用numpy的fliplr函数翻转图像数组中的元素with gr.Blocks() as demo:  # 使用gr.Blocks创建一个应用布局gr.Markdown("Flip text or image files using this demo.")  # 添加Markdown组件,显示说明文字with gr.Tab("Flip Text"):  # 在标签页中创建一个文本翻转功能text_input = gr.Textbox()  # 创建文本输入框text_output = gr.Textbox()  # 创建文本输出框,用于显示翻转后的文本text_button = gr.Button("Flip")  # 创建一个按钮,标签为Flipwith gr.Tab("Flip Image"):  # 在另一个标签页中创建图像翻转功能with gr.Row():  # 创建一行来并排放置输入和输出图像image_input = gr.Image()  # 创建图像输入组件image_output = gr.Image()  # 创建图像输出组件,用于显示翻转后的图像image_button = gr.Button("Flip")  # 创建一个按钮,标签为Flipwith gr.Accordion("Open for More!", open=False):  # 创建一个折叠区域,初始状态为关闭gr.Markdown("Look at me...")  # 在折叠区域中添加Markdown组件temp_slider = gr.Slider(minimum=0.0,  # 滑动条的最小值maximum=1.0,  # 滑动条的最大值value=0.1,  # 初始值step=0.1,  # 步长interactive=True,  # 设置为交互模式label="Slide me",  # 标签)temp_slider.change(lambda x: x, [temp_slider])  # 绑定滑动条的变化事件,仅作为演示text_button.click(flip_text, inputs=text_input, outputs=text_output)  # 将文本按钮的点击事件绑定到flip_text函数image_button.click(flip_image, inputs=image_input, outputs=image_output)  # 将图像按钮的点击事件绑定到flip_image函数demo.launch()  # 启动应用

这段代码演示了如何使用Gradio库创建一个Web应用,功能包括翻转文本和图像。应用界面使用标签页来区分文本翻转和图像翻转功能,其中每个功能都有对应的输入框、输出框以及一个触发操作的按钮。此外,还使用了折叠区域(Accordion)来隐藏额外的信息或工具,例如一个滑动条(Slider)。

  • 对于文本翻转,程序定义了一个flip_text函数,它接收用户输入的字符串,并返回其反向字符串作为输出。

  • 对于图像翻转,程序定义了一个flip_image函数,它使用numpyfliplr函数来实现图像的左右翻转。

这个应用可以用来翻转用户上传的文本或图像,并将翻转后的结果即时显示给用户。这是一个很好的示例,展示了Gradio框架如何用于快速搭建具有交互式输入和输出的机器学习或数据处理应用。

cf518c5d9dc74a4a0c37d6db4eeb81be.png

7672451b16db84e646da3748c3f744ff.png

也请注意本例中的 gr.Accordion('label') 。手风琴是一种可以切换打开或关闭的布局。像 Tabs 一样,它是一种可以选择性隐藏或显示内容的布局元素。定义在 with gr.Accordion('label'): 内的任何组件都会在点击手风琴的切换图标时被隐藏或显示。

在文档中了解更多关于标签页和手风琴的信息。

https://www.gradio.app/docs/gradio/tab 

https://gradio.app/docs/accordion

可见性 

组件和布局元素都有一个可以初始设置并且也可以更新的 visible 参数。在列上设置 gr.Column(visible=...) 可以用来显示或隐藏一组组件。

import gradio as gr  # 导入gradio库with gr.Blocks() as demo:  # 使用gr.Blocks创建一个应用布局error_box = gr.Textbox(label="Error", visible=False)  # 创建一个不可见的错误消息文本框name_box = gr.Textbox(label="Name")  # 创建姓名输入框age_box = gr.Number(label="Age", minimum=0, maximum=100)  # 创建年龄输入框,限定年龄范围在0到100岁symptoms_box = gr.CheckboxGroup(["Cough", "Fever", "Runny Nose"])  # 创建症状多选框submit_btn = gr.Button("Submit")  # 创建提交按钮with gr.Column(visible=False) as output_col:  # 创建一个初始不可见的列,用于显示返回结果diagnosis_box = gr.Textbox(label="Diagnosis")  # 诊断结果文本框patient_summary_box = gr.Textbox(label="Patient Summary")  # 患者摘要文本框def submit(name, age, symptoms):if len(name) == 0:  # 如果未输入姓名return {error_box: gr.Textbox(value="Enter name", visible=True)}  # 显示错误消息return {output_col: gr.Column(visible=True),  # 显示输出结果的列diagnosis_box: "covid" if "Cough" in symptoms else "flu",  # 根据症状给出初步诊断patient_summary_box: f"{name}, {age} y/o",  # 显示患者摘要}submit_btn.click(submit,  # 绑定点击事件到submit函数[name_box, age_box, symptoms_box],  # 指定输入参数[error_box, diagnosis_box, patient_summary_box, output_col],  # 指定输出参数)demo.launch()  # 启动应用

这段代码演示了如何使用Gradio库创建一个具有用户输入和动态结果展示的Web应用程序。用户可以通过填写姓名、年龄和选择症状,然后点击提交按钮来获取初步诊断结果。应用逻辑如下:

  • 用户输入姓名、选择年龄、选择一个或多个症状,然后点击“Submit”按钮。

  • 如果用户没有输入姓名,将会显示错误消息提示用户输入姓名。

  • 如果用户已经输入姓名,则显示患者的初步诊断结果和摘要信息。这里简化地根据是否选择了“咳嗽”作为症状来判断诊断结果是“covid”还是“flu”。

这个示例展示了Gradio在处理表单输入及动态显示结果方面的能力,特别是在医疗信息收集、初步诊断等应用场景中的潜在用途。

4d7f876ade9e44f5d9c88824e3b7c6ab.png

输出变量数量 

通过动态调整组件的可见性,可以创建支持可变输出数量的 Gradio 演示。这里有一个非常简单的例子,输出文本框的数量由输入滑块控制:

import gradio as gr  # 导入gradio库max_textboxes = 10  # 定义最大文本框数量def variable_outputs(k):  # 定义一个函数,根据滑块的值动态显示文本框k = int(k)  # 确保k是整数return [gr.Textbox(visible=True)]*k + [gr.Textbox(visible=False)]*(max_textboxes-k)  # 根据滑块的值动态生成可见和不可见的文本框列表with gr.Blocks() as demo:  # 使用gr.Blocks创建一个应用布局s = gr.Slider(1, max_textboxes, value=max_textboxes, step=1, label="How many textboxes to show:")  # 创建一个滑块,用于选择显示多少个文本框textboxes = []  # 初始化一个空列表,用于存储文本框组件for i in range(max_textboxes):  # 循环生成指定数量的文本框t = gr.Textbox(f"Textbox {i}")  # 创建文本框,并给予标签textboxes.append(t)  # 将文本框添加到列表中s.change(variable_outputs, s, textboxes)  # 将滑块的变化事件绑定到variable_outputs函数if __name__ == "__main__":demo.launch()  # 启动应用

0b5e28b82e2297caf390ed7c21faa64e.png

这段代码使用Gradio库创建了一个Web应用,该应用通过滑块控件允许用户动态选择显示的文本框数量。具体行为如下:

  • 应用中有一个滑块(gr.Slider),让用户选择要显示的文本框数量,范围从1到10。

  • 根据滑块的值,应用将显示相应数量的文本框,滑块值为多少就显示多少个文本框,最多显示10个。

  • 每个文本框在创建时被赋予一个唯一的标签,如"Textbox 0"、"Textbox 1"等。

  • 当用户调整滑块时,variable_outputs函数会被调用,该函数根据滑块的当前值动态调整文本框的可见性,使得只有指定数量的文本框是可见的,其余的则被设置为不可见。

这个示例展示了如何使用Gradio实现动态界面元素的显示与隐藏,通过Slider组件和绑定的事件处理函数来控制其他组件(如Textbox)的属性,这在创建需要根据用户输入动态调整内容的应用时非常有用。

分别定义和渲染组件 

在某些情况下,您可能希望在实际渲染 UI 之前定义组件。例如,您可能希望使用 gr.Examples 在相应的 gr.Textbox 输入上方显示一个示例部分。由于 gr.Examples 需要输入组件对象作为参数,您将需要首先定义输入组件,然后在定义了 gr.Examples 对象之后再渲染它。

解决方案是在 gr.Blocks() 范围之外定义 gr.Textbox ,并在 UI 中希望放置它的任何位置使用组件的 .render() 方法。

源代码示例:

input_textbox = gr.Textbox()with gr.Blocks() as demo:gr.Examples(["hello", "bonjour", "merhaba"], input_textbox)input_textbox.render()

00eaa5db77d8102727a59fd903738184.png

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

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

相关文章

JAVA云HIS医院管理系统源码 云HIS运维平台源码 SaaS模式支撑电子病历4级,HIS与电子病历系统均拥有自主知识产权

JAVA云HIS医院管理系统源码 云HIS运维平台源码 SaaS模式支撑电子病历4级,HIS与电子病历系统均拥有自主知识产权 系统简介: SaaS模式Java版云HIS系统,在公立二甲医院应用三年,经过多年持续优化和打磨,系统运行稳定、功…

SSH密钥认证:实现远程服务器免密登录的两种方法|Linux scp命令详解:高效实现文件与目录的远程传输

简介: 服务器之间经常需要有一些跨服务器的操作,此时就需要我们在一台服务器上登录到另外一台服务器,若是人为操作时我们都可以每次输入密码进行远程登录,但要是程序需要跨服务器时,每次输入密码就不现实了&#xff0c…

最新Sublime Text软件安装包分享(汉化版本)

Sublime Text 是一款广受欢迎的跨平台文本编辑器,专为代码、标记和散文编辑而设计。它以其简洁的用户界面、强大的功能和高性能而著称,深受开发者和写作者的喜爱。 一、下载地址 链接:https://pan.baidu.com/s/1kErSkvc7WnML7fljQZlcOg?pwdk…

解决:安装MySQL 5.7 的时候报错:unknown variable ‘mysqlx_port=0.0‘

目录 1. 背景2. 解决步骤 1. 背景 吐槽1,没被收购之前可以随便下载,现在下载要注册登录吐槽2,5.7安装到初始化数据库的时候就会报错,而8.x的可以一镜到底,一开始以为是国区的特色问题,google了一圈&#x…

[Algorithm][贪心][最长递增子序列][递增的三元子序列][最长连续递增序列][买卖股票的最佳时机][买卖股票的最佳时机Ⅱ]详细讲解

目录 1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.递增的三元子序列1.题目链接2.算法原理详解3.题目链接 3.最长连续递增序列1.题目链接2.算法原理详解3.代码实现 4.买卖股票的最佳时机1.题目链接2.算法原理详解3.代码实现 5.买卖股票的最佳时机 II1.题目链接2.算法…

厂里资讯之总体架构介绍以及环境搭建

本项目是本人根据黑马程序员的微服务项目黑马头条进行包装改造,作为实习简历上面的项目,为了进一步熟悉深挖这个项目,写了这一系列的博客来加深自己对项目的理解。 概述 项目背景 本项目主要着手于使用户获取学校最新最热的资讯&#xff0c…

使用 ML.NET CLI 自动进行模型训练

ML.NET CLI 可为 .NET 开发人员自动生成模型。 若要单独使用 ML.NET API(不使用 ML.NET AutoML CLI),需要选择训练程序(针对特定任务的机器学习算法的实现),以及要应用到数据的数据转换集(特征工程)。 每个数据集的最佳管道各不相同,从所有选择中选择最佳算法增加了复…

seata原理源码分析系列(一)架构, 组件

简介 SEATA开源的分布式事务解决方案,用于解决分布式系统中的数据一致性问题,由阿里巴巴开源。 分布式系统,数据存储在不同的资源管理器(数据库),需要保证分布式事务的原子性,业界比较常用xa,数据库标准实现…

C语言 | Leetcode C语言题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; void myResverse(char* s,int start,int end){while(start<end){char temp s[start];s[start] s[end];s[end] temp;start;end--;} } char* reverseWords(char* s) {int start 0;int end strlen(s)-1;myResverse(s,start,end);if(s[…

面试题:Redis是什么?有什么作用?怎么测试?

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么测试…

Linux系统使用Docker安装Dashy导航页结合内网穿透一键发布公网

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

机器视觉:工业镜头的主要参数

工业镜头是图像采集系统的重要光学设备。它的作用是将目标物体的像成在相机的感光面上。 一、工业镜头原理 镜头是对光线进行调制和变换&#xff0c;使目标能够成像到相机的感光芯片上。将不同折射率的硝材加工成高精度的曲面&#xff0c;再把这些曲面进行组合后设计成能够满…

秋招突击——6/14——复习{(树形DP)树的最长路径}——新作{非递归求二叉树的深度、重复区间合并}

文章目录 引言复习树形DP——树的最长路径 新作使用dfs非递归计算二叉树的深度多个区间合并删除问题实现思路实现代码参考思路 总结 引言 这两天可能有点波动&#xff0c;但是算法题还是尽量保证复习和新作一块弄&#xff0c;数量上可能有所差别。 复习 树形DP——树的最长路…

React state(及组件) 的保留与重置

当在树中相同的位置渲染相同的组件时&#xff0c;React 会一直保留着组件的 state return (<div><Counter />{showB && <Counter />} </div> ) // 当 showB 为 false, 第二个计数器停止渲染&#xff0c;它的 state 完全消失了。这是因为 React…

vite.config.js如何使用env的环境变量

了解下环境变量在vite中 官方文档走起 https://cn.vitejs.dev/guide/env-and-mode.html#env-variables-and-modes 你见到的.env,.env.production等就是放置环境变量的 官方文档说到.env.[mode] # 只在指定模式下加载,比如.env.development只在开发环境加载 至于为什么是deve…

windows下open webui+ollama+sd webui

原文&#xff1a;https://wangguo.site/Blog/2024/Q2/2024-06-14/ 说明&#xff1a;安装使用环境是在Windows下 1、给ollama一个好看的交互界面&#xff08;open webui&#xff09; 1.1、ollama安装 安装&#xff1a;在ollama官网下载windows版本进行安装 模型列表&#xff1…

【SQLAlChemy】表之间的关系,外键如何使用?

表之间的关系 数据库表之间的关系分为三种&#xff1a; 一对一关系&#xff08;One-to-One&#xff09;&#xff1a;在这种关系中&#xff0c;表A的每一行都与表B的一行关联&#xff0c;反之亦然。例如&#xff0c;每个人都有一个唯一的社保号&#xff0c;每个社保号也只属于…

南师大GIS专业2024排名NO.1!!!

南师大GIS 666 学科专业实力666&#xff0c;研究方向多多多&#xff01; 有学术方向有开发应用方向&#xff0c; 有GIS&#xff08;建模、数字地形、基础理论和三维GIS等&#xff09;、 有Cartography &#xff08;叙事地图、动态地图、地图风格迁移等&#…

Visual Studio Code 的安装教程和配置C语言环境插件推荐

目录 1.vscode简介2.下载安装vs code3.VSCode基础配置VSCode界面简介VSCode设置中文界面VSCode个性化设置VSCode常用设置基本编辑快捷键VSCode常用快捷键 4.下载安装MinGW5.设置vscode里的环境6.插件推荐7.vscode官方文档 1.vscode简介 VSCode是微软出的一款轻量级编辑器&…

Javaweb03-Servlet技术1(Servlet,ServletConfig,ServletContext)

Servlet技术(Servlet,ServletConfig,ServletContext) 1.Servlet的概述 Servlet是运行在Web服务器端的Java应用程序&#xff0c;它使用Java语言编写。与Java程序的区别是&#xff0c;Servlet 对象主要封装了对HTTP请求的处理&#xff0c;并且它的运行需要Servlet容器(Tomcat)的…