在Gradio实现两个下拉框进行联动案例解读:change/click/input实践(三)

news2024/12/23 13:07:29

本文的代码来自ChuanhuChatGPT,通过拆解写得比较好的gradio项目,可以更快理解gradio的一些使用。
ChuanhuChatGPT整体页面效果是比较合理的:
在这里插入图片描述

1 下拉框联动效果的解读

本篇是将一个其中【对话】中的【Prompt加载】小模块抽取出来并稍稍修改一下排版:
在这里插入图片描述

先来看一下这个模块功能实现了什么:

  • 一级下拉框,有一些选项,选择某一个,则会在二级下拉框显示该选项下还有哪些选项
  • 二级下拉框,一级下拉框选中后显示
  • 刷新功能,一级下拉+二级下拉
  • system prompt,是二级下拉框子项对应的内容

这里从数据上看一下数据二级结构:

test_data_1 = {'1':['11','12'],'2':['21','22']}

test_data_2 = {
    "11":'这里是{11}的输出',
    "12":'这里是{12}的输出',
    "21":'这里是{21}的输出',
    "22":'这里是{22}的输出',
    }

大概的流程:
在这里插入图片描述

2 代码解析

import math
import gradio as gr
import plotly.express as px
import numpy as np

small_and_beautiful_theme = gr.themes.Soft(
        primary_hue=gr.themes.Color(
            c50="#EBFAF2",
            c100="#CFF3E1",
            c200="#A8EAC8",
            c300="#77DEA9",
            c400="#3FD086",
            c500="#02C160",
            c600="#06AE56",
            c700="#05974E",
            c800="#057F45",
            c900="#04673D",
            c950="#2E5541",
            name="small_and_beautiful",
        ),
        secondary_hue=gr.themes.Color(
            c50="#576b95",
            c100="#576b95",
            c200="#576b95",
            c300="#576b95",
            c400="#576b95",
            c500="#576b95",
            c600="#576b95",
            c700="#576b95",
            c800="#576b95",
            c900="#576b95",
            c950="#576b95",
        ),
        neutral_hue=gr.themes.Color(
            name="gray",
            c50="#f6f7f8",
            # c100="#f3f4f6",
            c100="#F2F2F2",
            c200="#e5e7eb",
            c300="#d1d5db",
            c400="#B2B2B2",
            c500="#808080",
            c600="#636363",
            c700="#515151",
            c800="#393939",
            # c900="#272727",
            c900="#2B2B2B",
            c950="#171717",
        ),
        radius_size=gr.themes.sizes.radius_sm,
    ).set(
        # button_primary_background_fill="*primary_500",
        button_primary_background_fill_dark="*primary_600",
        # button_primary_background_fill_hover="*primary_400",
        # button_primary_border_color="*primary_500",
        button_primary_border_color_dark="*primary_600",
        button_primary_text_color="white",
        button_primary_text_color_dark="white",
        button_secondary_background_fill="*neutral_100",
        button_secondary_background_fill_hover="*neutral_50",
        button_secondary_background_fill_dark="*neutral_900",
        button_secondary_text_color="*neutral_800",
        button_secondary_text_color_dark="white",
        # background_fill_primary="#F7F7F7",
        # background_fill_primary_dark="#1F1F1F",
        # block_title_text_color="*primary_500",
        block_title_background_fill_dark="*primary_900",
        block_label_background_fill_dark="*primary_900",
        input_background_fill="#F6F6F6",
        # chatbot_code_background_color="*neutral_950",
        # gradio 会把这个几个chatbot打头的变量应用到其他md渲染的地方,鬼晓得怎么想的。。。
        chatbot_code_background_color_dark="*neutral_950",
    )


test_data_1 = {'1':['11','12'],'2':['21','22']}

test_data_2 = {
    "11":'这里是{11}的输出',
    "12":'这里是{12}的输出',
    "21":'这里是{21}的输出',
    "22":'这里是{22}的输出',
    }


with gr.Blocks(theme=small_and_beautiful_theme) as demo: # small_and_beautiful_theme 让页面边框变得简介
    # 控件框架
    with gr.Tab(label="对话"):
        with gr.Accordion(label="Prompt", open=True): # open可以选择下面整个模块是否显示
            with gr.Accordion(label="加载模板", open=True):# open可以选择下面整个模块是否显示
                with gr.Column():   # 模块按行排布
                    gr.Markdown("一级下拉:", elem_classes="hr-line")
                    with gr.Row():  # 模块按列排布
                        with gr.Column(scale=6):
                            templateFileSelectDropdown = gr.Dropdown( # 一级下拉菜单
                                label="选择模板集合文件",
                                choices= test_data_1.keys(),
                                multiselect=False,
                                value=list(test_data_1.keys())[0],
                                container=False,
                            )

                    with gr.Row():
                        # gr.Markdown("二级下拉:", elem_classes="hr-line")
                        with gr.Column():
                            gr.Markdown("二级下拉:", elem_classes="hr-line")
                            templateSelectDropdown = gr.Dropdown( # 二级下拉菜单
                                label="从模板中加载",
                                choices=None, 
                                multiselect=False,
                                container=False,
                            )
                    templateRefreshBtn = gr.Button("🔄 刷新") # 刷新按钮
            # 内容显示栏目
            systemPromptTxt = gr.Textbox( 
                show_label=True,
                placeholder="在这里输入System Prompt...",
                label="System prompt",
                value='请重新选择Prompt模版',
                lines=8
            )
            
    
    # 按钮功能1:刷新按钮的点击行为
        # get_template_dropdown 【刷新按钮】传导给【下拉菜单】 templateFileSelectDropdown
    def get_template_dropdown():
        # 输入:无输入项
        # 输出:更新【一级下拉】选项,【二级下拉】置空
        # 触发方式: click点击行为
        return gr.Dropdown.update(choices=test_data_1.keys()),None
    
    templateRefreshBtn.click(get_template_dropdown, None, 
                             [templateFileSelectDropdown,templateSelectDropdown])

    # 按钮功能2:选择一级下拉 -> 二级下拉联动
    def load_template(key):
        # 输入:templateFileSelectDropdown 【一级下拉】
        # 输出:更新【二级下拉】选项  templateSelectDropdown
        # 触发方式: input当用户更改组件的值时触发
        return gr.Dropdown.update(choices=test_data_1[key])
 
    templateFileSelectDropdown.change(
        load_template,
        templateFileSelectDropdown,
        [templateSelectDropdown],
        show_progress=True,
    )
    
    # 按钮功能3:二级菜单的选择
    def get_template_content(selection):
        # 输入:templateSelectDropdown 【二级下拉】
        # 输出:更新【system prompt】选项  systemPromptTxt
        # 触发方式: change当组件的值发生变化时触发
        try:
            return test_data_2[selection]
        except:
            return '请重新选择模版'
        
    templateSelectDropdown.change(
        get_template_content,
        [templateSelectDropdown],
        [systemPromptTxt],
        show_progress=True,
    )



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

具体看代码详情,这里简单提一下其中的一些要点:

  • gr.Blocks(theme=small_and_beautiful_theme) 这里是将gradio构造的控件页面变得更加美观,说不上来,效果如下:
    在这里插入图片描述
  • gr.Dropdown的下拉框参数包括(参考:gradio库中的Dropdown模块:创建交互式下拉菜单):
    在这里插入图片描述
  • 下拉框包括几种功能:update,input,change几种迭代功能:
    • update:更新Dropdown的状态
    • input:input方法是一个监听器,当用户更改组件的值时触发
    • change:change方法用于在组件的值发生变化时触发事件,无论是因为用户输入(例如用户在文本框中输入)还是函数更新(例如图像从事件触发的输出接收到值)
  • blur方法 (本案例中未使用) blur方法是Dropdown模块的一个监听器方法,当组件失去焦点时(例如用户在文本框外单击)触发。这个方法也可以在Gradio Blocks中使用。
  • select方法(本案例中未使用) select方法是Dropdown模块的一个事件监听器,当用户选择下拉菜单的选项时触发。该方法使用gradio.SelectData事件数据传递选项的标签值和索引。

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

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

相关文章

电商平台api接口,淘宝/天猫、1688、拼多多、亚马逊等电商数据平台api接口演示案例

API简单来说是一种数据的传输方式,使用已经开发好的API接口可以缩短项目时间,减少开发成本。 比如说数据宝平台提供的实名认证API接口,像这种实名认证类的API接口是无法自行开发的,如果自行对接部委,能否成功不说&…

【已解决】vscode 配置C51和MDK环境配置

使用命令 gcc -v -E -x c - 看自己gcc 有没有安装好 也可以在自己的vscode中新建一个终端 gcc -v g -v 首先把自己的C51 和MDK 路径 设置好 vscode 中设置 C51 和 MDK 的路径 这是你keil 中写 51单片机和 STM32 的 如果你出现什么include 的什么波浪线,那估计…

力扣511. 游戏玩法分析 I

答案: select player_id,min(event_date) as first_login from Activity a group by player_id我最开始写的错误答案是这样的: select player_id,event_date as first_login from Activity a group by player_id having event_date min(event_date…

一篇揭秘Linux高性能服务epoll 的本质

导语 epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能…

copilot 产生 python工具函数并生成单元测试

stock.py 这个文件,我只写了注释(的开头),大部分注释内容和函数都是copilot # split a string and extract the environment variable from it # input can be , pathabc, pathabc;pathdef, pathabc;pathdef;pathghi # output i…

快速拉取聚水潭单据的ETL工具

聚水潭介绍 聚水潭平台则是国内较为出名的电商ERP平台,为企业提供了便捷的销售和管理服务,专注于提高交易效率,但是如何将数据快速同步到其他系统一直是很多企业的痛点。 ETLCloud数据集成平台提供了丰富的数据分析工具和算法模型&#xff…

Oracle 账户被锁:the account is locked 解决方法

Oracle 账户被锁:the account is locked 解决方法 连接Oracle数据库时报错账户已锁定错误 解决方法一:命令行模式: 步骤一: WinR打开命令行输入:sqlplus 使用system或sys账户以管理员身份登录,口令即安装…

MySQL如何查找删除重复行?

如何查找重复行 第一步是定义什么样的行才是重复行。多数情况下很简单:它们某几列具有相同的值。本例采用这种定义,或许你对“重复”的定义得很复杂,你需要对sql做些修改。本例要用到的数据样本: create table test(id int not …

学用 DevChat 的 VSCode 插件,体验AI智能编程工具 (一)

简单说DevChat是一个辅助编程的智能工具,它可以通过自然语言对话的方式与开发者进行交流,帮助开发者更高效地完成编程任务。 有了人工智能工具,编程进入一个新天地。 闻名已久,不若体验一下。 一.准备工作 1.运行环境. A. p…

MS512非接触式读卡器 IC

MS512 是一款应用于 13.56MHz 非接触式通信中的高集 成度读写卡芯片。它利用了先进的调制和解调技术,完全集 成了在 13.56MHz 下的各种非接触式通信方式和协议。 主要特点  高度集成的解调和解码模拟电路  采用少量外部器件,即可将输出驱动级接…

如何使用群晖虚拟机部署本地网页文件实现公网远程访问?

文章目录 前言1. 安装网页运行环境1.1 安装php1.2 安装webstation 2. 下载网页源码文件2.1 访问网站地址并下载压缩包2.2 解压并上传至群辉NAS 3. 配置webstation3.1 配置网页服务3.2 配置网络门户 4. 局域网访问静态网页配置成功5. 使用cpolar发布静态网页,实现公网…

本地PHP搭建简单Imagewheel私人云图床,在外远程访问——“cpolar内网穿透”

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

互联网金融P2P主业务场景自动化测试

互联网金融P2P行业,近三年来发展迅速,如火如荼。 据不完全统计,全国有3000的企业。 “互联网”企业,几乎每天都会碰到一些奇奇怪怪的bug,作为在互联网企业工作的测试人员,风险和压力都巨大。那么我们如何降…

学习c#的第九天

目录 C# 可空类型(Nullable) C# 可空类型(Nullable) Null 合并运算符( ?? ) C# 数组(Array) 一维数组 声明及初始化赋值数组 多维数组 声明和初始化多维数组 访问和操作多…

【备忘】在Nginx服务器安装SSL证书

您可以在Nginx或Tengine服务器上安装SSL证书,实现通过HTTPS安全访问Web服务器。本文介绍如何为Nginx或Tengine服务器安装SSL证书。 重要 本文以CentOS 8.0 64位操作系统、Nginx 1.14.2为例介绍。不同版本的操作系统或Web服务器,部署操作可能有所差异&a…

<MySQL> MySQL中查询(retrieve)数据的基础操作

目录 一、查询(retrieve) 1.1 查询数据的方式概述 二、全列查询 2.1 语法 2.2 操作演示 2.3 全列查询需要慎重使用 三、指定列查询 3.1 语法 3.2 操作演示 四、表达式查询 4.1 语法 4.2 操作演示 4.3 null 参与表达式计算 4.3 表达式查询存…

2023前端流行的新技术

作为2023年之前的技术水平有限,以下是一些目前为止较为热门的前端开发技术和趋势,这些技术可能在2023年之前进一步发展和普及。 前端程序员可以考虑学习和掌握以下技术: 1.Vue 3和React Hooks:Vue.js和React是目前最受欢迎的JavaS…

Layer 2 真的为以太坊扩容了吗?

构建一个安全、对用户友好的去中心化网络的愿景,依赖于关键基础设施的发展。这个愿景由一个共享的经济框架支持,得到了亿万人的拥护。Layer 2 的扩展解决方案在构建这一基础和增强以太坊的能力方面起着至关重要的作用。这些项目相互协作,形成…

抢疯了!OpenAI开出1000万美元天价年薪 北大AI博士未毕业拿百万offer

图片 抢疯了,抢疯了!OpenAI和谷歌的抢人大战,已经进入白热化。 OpenAI给谷歌员工抛出了终极诱惑——500万到1000万美元的年薪!以及来自微软的用不完的算力! 图片 这不,谷歌复仇神器Gemini模型的关键研究…

【python】Django——django简介、django安装、创建项目、快速上手

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ Django基础——django安装、创建django项目、django快速上手 django简介django安装1. conda创建环境pydjango2. pip安装django3. django目录 创建项目1. 打开终端(cmd)2. 进入某个目录3.创建项目命令4.django项目…