Механизм обмена сообщениями/отзывами в приложениях Gradio
Я создаю приложение Gradio.
Обработка на стороне сервера может занять много времени, поэтому я хотел бы иметь возможность реализовать парадигму обмена сообщениями для обновления пользовательского интерфейса на основе статуса обработки.
Что-то вроде динамической установки значения компонента не работает (нет ошибки, просто нет обновления)
from time import sleep
import gradio as gr
import numpy as np
from gradio.components import Button, Image, Markdown, Textbox
def transform(component):
def _transform(text):
for i in range(5):
component.update(value=str(i))
sleep(1)
return np.random.randint(0, 230, (100, 100, 3))
return _transform
with gr.Blocks() as app:
inp = Textbox(label="Your message")
out = Image(label="Your transformed message")
feedback = Markdown(value="Initial")
btn = Button("See for yourself!", label="Run")
btn.click(transform(feedback), inputs=inp, outputs=out)
app.launch()
Здесь вы можете видеть, что «Initial» все еще там вместо «4».
1 ответ
Вы можете сделать это, преобразовав вашу функцию в генератор. В основном просто изменитеreturn
ключевое слово дляyield
. Вам также потребуется включить.queue()
.
Этот код должен работать:
import gradio as gr
from gradio.components import Markdown, Textbox, Button
from time import sleep
def transform(component):
for i in range(5):
yield str(i)
sleep(3)
yield f"text -- {i}"
with gr.Blocks() as app:
inp = Textbox(label="Your message")
out = Textbox(label="Your transformed message")
feedback = Markdown("Initial")
btn = Button("See for yourself!", label="Run")
btn.click(transform, inputs=inp, outputs=out)
app.queue()
app.launch()