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

本文的代码来自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事件数据传递选项的标签值和索引。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP卷一详解第二章Internet地址结构概要

在这一章中介绍了Internet中使用的网络层地址(也就是IP地址),还有如何为Internet中的设备分配地址,以及各种类型的地址等等…… 一、IP地址的表示 为大家所常见的有IPV4地址和IPV6地址,但在IPV4地址中,通…

JOSEF约瑟 电压继电器 DY-32/60C 板前接线 可订做导轨安装

DY-32/60C,DY-34/60C电磁式过电压继电器,用于继电保护线路中,作为过电压保护或低电压闭锁的动作元件。 系列型号 DY-32电压继电器; DY-36电压继电器; DY-33电压继电器; DY-37电压继电器; DY-34…

轻盈创新,气膜体育馆

气膜体育馆采用高强度、高柔性的薄膜材料为主要构建元素。其制作过程包括将膜材的外沿固定在地面基础或屋顶结构周边,并搭配智能化的机电设备,通过吹气实现室内空间的密闭。利用密闭空间内的气压支撑原理,当室内气压大于外部气压时&#xff0…

Minecraft开服教程:使用MCSM面板一键搭建我的世界服务器并实现远程联机

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 前言 MCSManager是一个…

期中成绩这样发

数字化时代,成绩查询系统已经成为学校里不可或缺的一部分。老师们需要一种方便、快捷、准确的方式来发布和查询成绩,而学生们则需要一种安全、可靠的方式来获取自己的成绩。那么,如何实现这一目标呢?我来给大家介绍几种简单实用的…

vue2【计算属性】

目录 1:计算属性的作用 2:代码示例 3:特点 4:好处 1:计算属性的作用 计算属性指的是通过将属性经过运算,最终得到一个属性值,这个属性值可以在method节点下和模板结构中被使用。 2&#x…

Jenkins 搭建

GitLab GitLab安装 https://gitlab.cn/install/?versionce CentOS 下安装 1. 安装和配置必须的依赖项 在 CentOS 7上,下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤,如果您打算仅从本地网络访问极狐GitLab&#xf…

Containerd接入Harbor仓库

在使用容器时,避免不了会使用到私有仓库,一般都是采用 harbor 作为私有仓库,docker 对接 harbor 仓库非常简单,哪 containerd 如何对接 harbor 呢? 在内网使用 harbor 根据个人习惯,一般都是非 http 并且是…

华东“启明”青少年音乐艺术实践中心揭幕暨中国“启明”巴洛克合奏团首演音乐会

2023年11月11日,华东“启明”青少年音乐艺术实践中心在上海揭幕,中国“启明”巴洛克合奏团开启了首场音乐会。 华东“启明”青少年音乐艺术实践中心由中共宁波市江北区委宣传部与上音管风琴艺术中心联合指导,宁波音乐港、宁波市江北区洛奇音乐…

未来之选:为什么向量数据库是您的数据管理利器

文章目录 前言什么是向量数据库?向量数据库的机制向量数据库的优点‍查询向量数据库 什么是向量Embedding?Amazon OpenSearch Service总结 前言 向量数据库擅长处理复杂的高维数据,正在彻底改变商业世界的数据检索和分析。它们执行相似性搜索…

ECharts:显示暂无数据

ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求,实现各种炫酷的统计图表效果。 如上图所示,有数据的时候固然好看,但是当它没有数据的时候,就是光秃秃的一片,所…

【SpringBoot3+Vue3】一【基础篇】

目录 一、Spring Boot概述 1、Spring Boot 特性 1.1 起步依赖 1.2 自动配置 1.3 其他特性 1.3.1 内嵌的Tomcat、Jetty (无需部署WAR文件) 1.3.2 外部化配置 1.3.3 不需要XML配置(properties/yml) 二、Spring Boot入门 1、一个入门程序需求 2、步骤 2.1 创建Maven工…

朋友圈折叠·怎么办?

1.定时发圈 编辑好内容选定不同时间自动发送,防止太集中发好几条或者忘记发圈。在右侧选择要发圈的号和自定义时间。 2.自动跟圈 系统折叠朋友圈很大一部分原因就是检测到这段话是复制粘贴的文字。 设置跟圈后,可以让您系统上的微信,自动转…

郑州大学2020级信息安全专业——保研小结

最终上岸 夏令营: 夏令营开始的时间一般比较早,在期末考试之前就已经开始了,需要提前联系导师,有的学校是弱com,导师愿意要你入营的概率和优营的概率就会比较大,因此要提前联系导师,复习好项目…

rhcsa-权限

文件目录 r 读取权限 可以列出目录下的文件 w 修改权限 可以进行创建和删除等操作 x 执行权限 能进入到该目录/切换到该目录 - 没有权限 没有权限 chmod change mod 作用:修改文件或目录的权限 语法&…

【MySQL】事务(上)

文章目录 事务概念什么是事务?为什么要有事务?事务的版本支持事务的提交方式事务常见操作方式基本操作 事务概念 mysql 本身内部采用 多线程的方式,来实现数据存储 相关的工作 就注定对数据 有并发访问的场景 为了解决这类问题,就…

Jenkins在Linux环境下的安装与配置

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成(CI)工具,用于解决持续重复的部署、监控工作;它一个开放易用的软件平台,大大简化软件的持续集成。 安装Jenkins 1.使用docker安装 2.本地下载je…

网易有道上线“易魔声” 开源语音合成引擎 用户可免费下载使用

网易有道上线“易魔声” 开源语音合成引擎 用户可免费下载使用 刚刚,我们上线了「易魔声」开源语音合成(TTS)引擎!🎉🎉🎉 「易魔声」,是一款有道自研TTS引擎,目前支持中…

ACM练习——第一天

因为最近要去农大参加他们的算法邀请赛,然后赛制是ACM赛制的,所以我就直接很迷茫。 然后我就找到了牛客的ACM练习题,好好的练习一下ACM写法,而且我还要被迫写C,哭了。 开始钻研 1.从Java过度到C 题目源于牛客网&…

MTK手机平台充电原理

EPT GPIO初始化文件 bsp_gpio_ept_config.c 1 知识点总结 1.1 Official 参考充电电路 Figure 1-1 参考电路 VCHG:USB正极 VCDT:VCHG Charger Detect充电电压检测脚 ISENSE:充电电流检测电阻的正极 BATSNS:充电电流检测电阻的负极 …