Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"Introducción a Gradio Blocks","local":"introduction-to-gradio-blocks","sections":[{"title":"¿Por qué Blocks 🧱?","local":"why-blocks-","sections":[],"depth":3},{"title":"Creando una demo simple con Blocks","local":"creating-a-simple-demo-using-blocks","sections":[],"depth":3},{"title":"Personalizando el diseño de tu demo","local":"customizing-the-layout-of-your-demo","sections":[],"depth":3},{"title":"Explorando eventos y estado","local":"exploring-events-and-state","sections":[],"depth":3},{"title":"Creando demos de múltiples pasos","local":"creating-multi-step-demos","sections":[],"depth":3},{"title":"Actualizando propiedades de los componentes","local":"updating-component-properties","sections":[],"depth":3}],"depth":1}"/> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/entry/start.D59QwzHK.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/DUcnc3yr.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/BA_dZbsI.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/entry/app.C66ScwXN.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/C0jRxzmK.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/DvbUaM1Q.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/DWsOGz31.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/DsnmJJEf.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/nodes/0.BC20zKcV.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/C3nIf8Go.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/nodes/46.D844lDLq.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/DX9wbpOW.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/r2R_RyXK.js" rel="modulepreload"> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/chunks/Khighb8g.js" rel="modulepreload"> | |
| <!--1tecxer--><meta name="hf:doc:metadata" content="{"title":"Introducción a Gradio Blocks","local":"introduction-to-gradio-blocks","sections":[{"title":"¿Por qué Blocks 🧱?","local":"why-blocks-","sections":[],"depth":3},{"title":"Creando una demo simple con Blocks","local":"creating-a-simple-demo-using-blocks","sections":[],"depth":3},{"title":"Personalizando el diseño de tu demo","local":"customizing-the-layout-of-your-demo","sections":[],"depth":3},{"title":"Explorando eventos y estado","local":"exploring-events-and-state","sections":[],"depth":3},{"title":"Creando demos de múltiples pasos","local":"creating-multi-step-demos","sections":[],"depth":3},{"title":"Actualizando propiedades de los componentes","local":"updating-component-properties","sections":[],"depth":3}],"depth":1}"/><!----> | |
| <link href="/docs/course/pr_1345/es/_app/immutable/assets/0.tn0RQdqM.css" rel="modulepreload"> <!--[--><!--[0--><!--[--><!--[0--><!--[--><p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"><div class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----></span> <span>Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg><!----></button></div> <!--[-1--><!--]--></div><!----> <!--[0--><h1 class="relative group"><a id="introduction-to-gradio-blocks" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#introduction-to-gradio-blocks"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Introducción a Gradio Blocks</span></h1><!--]--><!----> <div class="flex space-x-1 absolute z-10 right-0 top-0"><a href="https://discuss.huggingface.co/t/chapter-9-questions" target="_blank"><img alt="Ask a Question" class="!m-0" src="https://img.shields.io/badge/Ask%20a%20question-ffcb4c.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTEgMTA0IDEwNiI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMyMzFmMjA7fS5jbHMtMntmaWxsOiNmZmY5YWU7fS5jbHMtM3tmaWxsOiMwMGFlZWY7fS5jbHMtNHtmaWxsOiMwMGE5NGY7fS5jbHMtNXtmaWxsOiNmMTVkMjI7fS5jbHMtNntmaWxsOiNlMzFiMjM7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5EaXNjb3Vyc2VfbG9nbzwvdGl0bGU+PGcgaWQ9IkxheWVyXzIiPjxnIGlkPSJMYXllcl8zIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MS44NywwQzIzLjcxLDAsMCwyMi44MywwLDUxYzAsLjkxLDAsNTIuODEsMCw1Mi44MWw1MS44Ni0uMDVjMjguMTYsMCw1MS0yMy43MSw1MS01MS44N1M4MCwwLDUxLjg3LDBaIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNTIuMzcsMTkuNzRBMzEuNjIsMzEuNjIsMCwwLDAsMjQuNTgsNjYuNDFsLTUuNzIsMTguNEwzOS40LDgwLjE3YTMxLjYxLDMxLjYxLDAsMSwwLDEzLTYwLjQzWiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTc3LjQ1LDMyLjEyYTMxLjYsMzEuNiwwLDAsMS0zOC4wNSw0OEwxOC44Niw4NC44MmwyMC45MS0yLjQ3QTMxLjYsMzEuNiwwLDAsMCw3Ny40NSwzMi4xMloiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik03MS42MywyNi4yOUEzMS42LDMxLjYsMCwwLDEsMzguOCw3OEwxOC44Niw4NC44MiwzOS40LDgwLjE3QTMxLjYsMzEuNiwwLDAsMCw3MS42MywyNi4yOVoiLz48cGF0aCBjbGFzcz0iY2xzLTUiIGQ9Ik0yNi40Nyw2Ny4xMWEzMS42MSwzMS42MSwwLDAsMSw1MS0zNUEzMS42MSwzMS42MSwwLDAsMCwyNC41OCw2Ni40MWwtNS43MiwxOC40WiIvPjxwYXRoIGNsYXNzPSJjbHMtNiIgZD0iTTI0LjU4LDY2LjQxQTMxLjYxLDMxLjYxLDAsMCwxLDcxLjYzLDI2LjI5YTMxLjYxLDMxLjYxLDAsMCwwLTQ5LDM5LjYzbC0zLjc2LDE4LjlaIi8+PC9nPjwvZz48L3N2Zz4="/></a><!----> <!--[0--><a href="https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter9/section7.ipynb" target="_blank"><img alt="Open In Colab" class="!m-0" src="https://colab.research.google.com/assets/colab-badge.svg"/></a><!--]--> <!--[0--><a href="https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter9/section7.ipynb" target="_blank"><img alt="Open In Studio Lab" class="!m-0" src="https://studiolab.sagemaker.aws/studiolab.svg"/></a><!--]--></div><!----> <p>En las secciones anteriores hemos explorado y creado demos utilizando la clase <code>Interface</code>. En esta sección presentaremos nuestra API de bajo nivel llamada <code>gradio.Blocks</code>.</p> <p>Ahora bien, ¿cuál es la diferencia entre <code>Interface</code> y <code>Blocks</code>?</p> <ul><li><p>⚡ <code>Interface</code>: una API de alto nivel que te permite crear una demo completa de aprendizaje automático simplemente proporcionando una lista de entradas y salidas.</p></li> <li><p>🧱 <code>Blocks</code>: una API de bajo nivel que te permite tener un control total sobre los flujos de datos y el diseño (<em>layout</em>) de tu aplicación. Puedes construir aplicaciones muy complejas y de múltiples pasos usando <code>Blocks</code> (como en “bloques de construcción”).</p></li></ul> <!--[2--><h3 class="relative group"><a id="why-blocks-" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#why-blocks-"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>¿Por qué Blocks 🧱?</span></h3><!--]--><!----> <p>Como vimos en las secciones anteriores, la clase <code>Interface</code> te permite crear fácilmente demos completas de aprendizaje automático con solo unas pocas líneas de código. La API <code>Interface</code> es extremadamente fácil de usar pero carece de la flexibilidad que brinda la API <code>Blocks</code>. Por ejemplo, podrías querer:</p> <ul><li>Agrupar demos relacionadas en múltiples pestañas en una sola aplicación web.</li> <li>Cambiar el diseño de tu demo, por ejemplo para especificar dónde se ubican las entradas y salidas.</li> <li>Tener interfaces de múltiples pasos, en las que la salida de un modelo se convierte en la entrada del siguiente modelo, o tener flujos de datos más flexibles en general.</li> <li>Cambiar las propiedades de un componente (por ejemplo, las opciones en un menú desplegable) o su visibilidad según la entrada del usuario.</li></ul> <p>Exploraremos todos estos conceptos a continuación.</p> <!--[2--><h3 class="relative group"><a id="creating-a-simple-demo-using-blocks" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#creating-a-simple-demo-using-blocks"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Creando una demo simple con Blocks</span></h3><!--]--><!----> <p>Una vez que hayas instalado Gradio, ejecuta el código siguiente como un script de Python, en un notebook de Jupyter o en un notebook de Colab:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> Copied</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">flip_text</span>(<span class="hljs-params">x</span>): | |
| <span class="hljs-keyword">return</span> x[::-<span class="hljs-number">1</span>] | |
| demo = gr.Blocks() | |
| <span class="hljs-keyword">with</span> demo: | |
| gr.Markdown( | |
| <span class="hljs-string">""" | |
| # Flip Text! | |
| Start typing below to see the output. | |
| """</span> | |
| ) | |
| <span class="hljs-built_in">input</span> = gr.Textbox(placeholder=<span class="hljs-string">"Flip this text"</span>) | |
| output = gr.Textbox() | |
| <span class="hljs-built_in">input</span>.change(fn=flip_text, inputs=<span class="hljs-built_in">input</span>, outputs=output) | |
| demo.launch()<!----></pre></div><!----> <iframe src="https://course-demos-flip-text.hf.space" frameborder="0" height="400" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> <p>Este sencillo ejemplo anterior introduce 4 conceptos fundamentales de Blocks:</p> <ol><li><p>Blocks te permite crear aplicaciones web que combinan Markdown, HTML, botones y componentes interactivos simplemente instanciando objetos en Python dentro de un contexto <code>with gradio.Blocks</code>.</p> <blockquote class="tip"><p>🙋 Si no estás familiarizado con la sentencia <code>with</code> en Python, te recomendamos consultar el excelente <a href="https://realpython.com/python-with-statement/" rel="nofollow">tutorial</a> de Real Python. ¡Regresa aquí después de leerlo 🤗! | |
| El orden en que instancias los componentes importa, ya que cada elemento se representa en la aplicación web en el orden en que fue creado (los diseños más complejos se discuten a continuación).</p></blockquote></li> <li><p>Puedes definir funciones regulares de Python en cualquier parte de tu código y ejecutarlas con la entrada del usuario usando <code>Blocks</code>. En nuestro ejemplo, tenemos una función simple que “invierte” el texto de entrada, pero puedes escribir cualquier función de Python, desde un cálculo simple hasta procesar las predicciones de un modelo de aprendizaje automático.</p></li> <li><p>Puedes asignar eventos a cualquier componente de <code>Blocks</code>. Esto ejecutará tu función cuando se haga clic en el componente, cambie su valor, etc. Cuando asignas un evento, pasas tres parámetros: <code>fn</code>: la función a la que se debe llamar, <code>inputs</code>: la (lista de) componentes de entrada, y <code>outputs</code>: la (lista de) componentes de salida que se deben actualizar.</p> <p>En el ejemplo anterior, ejecutamos la función <code>flip_text()</code> cuando cambia el valor en el <code>Textbox</code> llamado <code>input</code>. El evento lee el valor en <code>input</code>, lo pasa a <code>flip_text()</code>, que luego devuelve un valor que se asigna a nuestro segundo <code>Textbox</code> llamado <code>output</code>.</p> <p>Para ver una lista de los eventos que admite cada componente, consulta la <a href="https://www.gradio.app/docs/" rel="nofollow">documentación de Gradio</a>.</p></li> <li><p>Blocks determina automáticamente si un componente debe ser interactivo (aceptar entradas del usuario) o no, según los disparadores de eventos que definas. En nuestro ejemplo, el primer cuadro de texto es interactivo, ya que su valor es utilizado por la función <code>flip_text()</code>. El segundo cuadro de texto no es interactivo, ya que su valor nunca se usa como entrada. En algunos casos, es posible que desees anular esto, lo cual puedes hacer pasando un booleano al parámetro <code>interactive</code> del componente (por ejemplo, <code>gr.Textbox(placeholder="Flip this text", interactive=True)</code>).</p></li></ol> <!--[2--><h3 class="relative group"><a id="customizing-the-layout-of-your-demo" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#customizing-the-layout-of-your-demo"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Personalizando el diseño de tu demo</span></h3><!--]--><!----> <p>¿Cómo podemos usar <code>Blocks</code> para personalizar el diseño de nuestra demo? De forma predeterminada, <code>Blocks</code> representa los componentes que creas verticalmente en una columna. Puedes cambiar eso creando columnas adicionales <code>with gradio.Column():</code> o filas <code>with gradio.Row():</code> y creando componentes dentro de esos contextos.</p> <p>Esto es lo que debes tener en cuenta: cualquier componente creado bajo una <code>Column</code> (este también es el valor predeterminado) se dispondrá verticalmente. Cualquier componente creado bajo una <code>Row</code> se dispondrá horizontalmente, similar al <a href="https://developer.mozilla.org/es/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox" rel="nofollow">modelo flexbox en desarrollo web</a>.</p> <p>Por último, también puedes crear pestañas para tu demo utilizando el administrador de contexto <code>with gradio.Tabs():</code>. Dentro de este contexto, puedes crear múltiples pestañas especificando elementos secundarios <code>with gradio.TabItem(name_of_tab):</code>. Cualquier componente creado dentro de un contexto <code>with gradio.TabItem(name_of_tab):</code> aparecerá en esa pestaña.</p> <p>Ahora agreguemos una función <code>flip_image()</code> a nuestra demo y agreguemos una nueva pestaña que invierta imágenes. A continuación se muestra un ejemplo con 2 pestañas y que también usa una fila:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> Copied</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr | |
| demo = gr.Blocks() | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">flip_text</span>(<span class="hljs-params">x</span>): | |
| <span class="hljs-keyword">return</span> x[::-<span class="hljs-number">1</span>] | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">flip_image</span>(<span class="hljs-params">x</span>): | |
| <span class="hljs-keyword">return</span> np.fliplr(x) | |
| <span class="hljs-keyword">with</span> demo: | |
| gr.Markdown(<span class="hljs-string">"Flip text or image files using this demo."</span>) | |
| <span class="hljs-keyword">with</span> gr.Tabs(): | |
| <span class="hljs-keyword">with</span> gr.TabItem(<span class="hljs-string">"Flip Text"</span>): | |
| <span class="hljs-keyword">with</span> gr.Row(): | |
| text_input = gr.Textbox() | |
| text_output = gr.Textbox() | |
| text_button = gr.Button(<span class="hljs-string">"Flip"</span>) | |
| <span class="hljs-keyword">with</span> gr.TabItem(<span class="hljs-string">"Flip Image"</span>): | |
| <span class="hljs-keyword">with</span> gr.Row(): | |
| image_input = gr.Image() | |
| image_output = gr.Image() | |
| image_button = gr.Button(<span class="hljs-string">"Flip"</span>) | |
| text_button.click(flip_text, inputs=text_input, outputs=text_output) | |
| image_button.click(flip_image, inputs=image_input, outputs=image_output) | |
| demo.launch()<!----></pre></div><!----> <iframe src="https://course-demos-flip-text-image.hf.space" frameborder="0" height="450" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> <p>Notarás que en este ejemplo también hemos creado un componente <code>Button</code> en cada pestaña, y hemos asignado un evento de clic a cada botón, que es lo que realmente ejecuta la función.</p> <!--[2--><h3 class="relative group"><a id="exploring-events-and-state" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#exploring-events-and-state"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Explorando eventos y estado</span></h3><!--]--><!----> <p>Así como puedes controlar el diseño, <code>Blocks</code> te brinda un control detallado sobre qué eventos activan las llamadas a funciones. Cada componente y muchos diseños tienen eventos específicos que admiten.</p> <p>Por ejemplo, el componente <code>Textbox</code> tiene 2 eventos: <code>change()</code> (cuando cambia el valor dentro del cuadro de texto) y <code>submit()</code> (cuando el usuario presiona la tecla enter mientras está enfocado en el cuadro de texto). Los componentes más complejos pueden tener aún más eventos: por ejemplo, el componente <code>Audio</code> también tiene eventos separados para cuando el archivo de audio se reproduce, se borra, se pausa, etc. Consulta la documentación para conocer los eventos admitidos por cada componente.</p> <p>Puedes adjuntar activadores de eventos a ninguno, a uno o a varios de estos eventos. Creas un disparador de eventos llamando al nombre del evento en la instancia del componente como una función, por ejemplo <code>textbox.change(...)</code> o <code>btn.click(...)</code>. La función toma tres parámetros, como se explicó anteriormente:</p> <ul><li><code>fn</code>: la función a ejecutar.</li> <li><code>inputs</code>: una (lista de) componente(s) cuyos valores se deben suministrar como parámetros de entrada a la función. El valor de cada componente se asigna al parámetro de función correspondiente, en orden. Este parámetro puede ser <code>None</code> si la función no toma ningún parámetro.</li> <li><code>outputs</code>: una (lista de) componente(s) cuyos valores se deben actualizar en función de los valores devueltos por la función. Cada valor devuelto establece el valor del componente correspondiente, en orden. Este parámetro puede ser <code>None</code> si la función no devuelve nada.</li></ul> <p>Incluso puedes hacer que el componente de entrada y salida sea el mismo componente, como hacemos en este ejemplo que usa un modelo GPT para completar texto:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> Copied</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr | |
| api = gr.Interface.load(<span class="hljs-string">"huggingface/EleutherAI/gpt-j-6B"</span>) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">complete_with_gpt</span>(<span class="hljs-params">text</span>): | |
| <span class="hljs-comment"># Use the last 50 characters of the text as context</span> | |
| <span class="hljs-keyword">return</span> text[:-<span class="hljs-number">50</span>] + api(text[-<span class="hljs-number">50</span>:]) | |
| <span class="hljs-keyword">with</span> gr.Blocks() <span class="hljs-keyword">as</span> demo: | |
| textbox = gr.Textbox(placeholder=<span class="hljs-string">"Type here and press enter..."</span>, lines=<span class="hljs-number">4</span>) | |
| btn = gr.Button(<span class="hljs-string">"Generate"</span>) | |
| btn.click(complete_with_gpt, textbox, textbox) | |
| demo.launch()<!----></pre></div><!----> <iframe src="https://course-demos-blocks-gpt.hf.space" frameborder="0" height="300" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> <!--[2--><h3 class="relative group"><a id="creating-multi-step-demos" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#creating-multi-step-demos"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Creando demos de múltiples pasos</span></h3><!--]--><!----> <p>En algunos casos, es posible que desees una <em>demo de múltiples pasos</em>, en la que reutilices la salida de una función como la entrada de la siguiente. Esto es realmente fácil de hacer con <code>Blocks</code>, ya que puedes usar un componente para la entrada de un disparador de eventos pero como la salida de otro. Echa un vistazo al componente de texto en el ejemplo siguiente: su valor es el resultado de un modelo de voz a texto (<em>speech-to-text</em>), pero también se pasa a un modelo de análisis de sentimientos (<em>sentiment analysis</em>):</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> Copied</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline | |
| <span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr | |
| asr = pipeline(<span class="hljs-string">"automatic-speech-recognition"</span>, <span class="hljs-string">"facebook/wav2vec2-base-960h"</span>) | |
| classifier = pipeline(<span class="hljs-string">"text-classification"</span>) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">speech_to_text</span>(<span class="hljs-params">speech</span>): | |
| text = asr(speech)[<span class="hljs-string">"text"</span>] | |
| <span class="hljs-keyword">return</span> text | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">text_to_sentiment</span>(<span class="hljs-params">text</span>): | |
| <span class="hljs-keyword">return</span> classifier(text)[<span class="hljs-number">0</span>][<span class="hljs-string">"label"</span>] | |
| demo = gr.Blocks() | |
| <span class="hljs-keyword">with</span> demo: | |
| audio_file = gr.Audio(<span class="hljs-built_in">type</span>=<span class="hljs-string">"filepath"</span>) | |
| text = gr.Textbox() | |
| label = gr.Label() | |
| b1 = gr.Button(<span class="hljs-string">"Recognize Speech"</span>) | |
| b2 = gr.Button(<span class="hljs-string">"Classify Sentiment"</span>) | |
| b1.click(speech_to_text, inputs=audio_file, outputs=text) | |
| b2.click(text_to_sentiment, inputs=text, outputs=label) | |
| demo.launch()<!----></pre></div><!----> <iframe src="https://course-demos-blocks-multi-step.hf.space" frameborder="0" height="600" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> <!--[2--><h3 class="relative group"><a id="updating-component-properties" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#updating-component-properties"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span>Actualizando propiedades de los componentes</span></h3><!--]--><!----> <p>Hasta ahora, hemos visto cómo crear eventos para actualizar el valor de otro componente. Pero, ¿qué sucede si deseas cambiar otras propiedades de un componente, como la visibilidad de un cuadro de texto o las opciones en un grupo de botones de opción (<em>radio buttons</em>)? Puedes hacer esto devolviendo el método <code>update()</code> de la clase del componente en lugar de un valor de retorno normal desde tu función.</p> <p>Esto se ilustra más fácilmente con un ejemplo:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> Copied</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">change_textbox</span>(<span class="hljs-params">choice</span>): | |
| <span class="hljs-keyword">if</span> choice == <span class="hljs-string">"short"</span>: | |
| <span class="hljs-keyword">return</span> gr.Textbox.update(lines=<span class="hljs-number">2</span>, visible=<span class="hljs-literal">True</span>) | |
| <span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"long"</span>: | |
| <span class="hljs-keyword">return</span> gr.Textbox.update(lines=<span class="hljs-number">8</span>, visible=<span class="hljs-literal">True</span>) | |
| <span class="hljs-keyword">else</span>: | |
| <span class="hljs-keyword">return</span> gr.Textbox.update(visible=<span class="hljs-literal">False</span>) | |
| <span class="hljs-keyword">with</span> gr.Blocks() <span class="hljs-keyword">as</span> block: | |
| radio = gr.Radio( | |
| [<span class="hljs-string">"short"</span>, <span class="hljs-string">"long"</span>, <span class="hljs-string">"none"</span>], label=<span class="hljs-string">"What kind of essay would you like to write?"</span> | |
| ) | |
| text = gr.Textbox(lines=<span class="hljs-number">2</span>, interactive=<span class="hljs-literal">True</span>) | |
| radio.change(fn=change_textbox, inputs=radio, outputs=text) | |
| block.launch()<!----></pre></div><!----> <iframe src="https://course-demos-blocks-update-component-properties.hf.space" frameborder="0" height="300" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> <p>¡Acabamos de explorar todos los conceptos centrales de <code>Blocks</code>! Al igual que con <code>Interface</code>, puedes crear demos geniales que se pueden compartir usando <code>share=True</code> en el método <code>launch()</code> o desplegar en <a href="https://huggingface.co/spaces" rel="nofollow">Hugging Face Spaces</a>.</p> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/course/blob/main/chapters/es/chapter9/7.mdx" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg><!----> <span><span class="underline">Update</span> on GitHub</span></a><!----> <p></p><!--]--><!----><!--]--><!--]--><!--]--> <!--[-1--><!--]--><!--]--> | |
| <script> | |
| { | |
| __sveltekit_16c26mw = { | |
| base: "/docs/course/pr_1345/es", | |
| assets: "/docs/course/pr_1345/es" | |
| }; | |
| const element = document.currentScript.parentElement; | |
| Promise.all([ | |
| import("/docs/course/pr_1345/es/_app/immutable/entry/start.D59QwzHK.js"), | |
| import("/docs/course/pr_1345/es/_app/immutable/entry/app.C66ScwXN.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 46], | |
| data: [null,null], | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 42.7 kB
- Xet hash:
- b0121daf67959e6825474ee47a6974e9cfe436af144444bea8b392856400cb70
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.