gradio-app / gradio

Build and share delightful machine learning apps, all in Python. 🌟 Star to support our work!
http://www.gradio.app
Apache License 2.0
30.56k stars 2.27k forks source link

How to get the value about creating dynamic component #8562

Closed wow-ww closed 1 week ago

wow-ww commented 1 week ago

Hello @abidlabs @aliabid94! I am having in trouble.this is a code.

import gradio as gr

def get_text(args):
    print(args)

with gr.Blocks() as demo:
    boxes = gr.State([])
    text_count = gr.Slider(1, 5, step=1, label="Textbox Count")

    @gr.render(inputs=[text_count], triggers=[text_count.change])
    def render_count(count):
        list = []
        for i in range(count):
            box = gr.Textbox(label=f"Box {i}")
            list.append(box)
        boxes.value = list

    with gr.Row():
        btn = gr.Button("getText")
        btn.click(get_text, boxes)
demo.launch()

textbox will be rendering by text_count. Now I want to get input value in every textbox by user. And I always get the args is that [<gradio.components.textbox.Textbox object at 0x000002BA020F8D50>, <gradio.components.textbox.Textbox object at 0x000002BA031C9450>] in function get_text. What should I do to get Textbox's input value?

abidlabs commented 1 week ago

Hi @wow-ww here's an example of how you can achieve this:

import gradio as gr

with gr.Blocks() as demo:
    text_count = gr.Slider(1, 5, step=1, label="Textbox Count")

    @gr.render(inputs=text_count)
    def render_count(count):
        boxes = []
        for i in range(count):
            box = gr.Textbox(key=i, label=f"Box {i}")                
            boxes.append(box)

        def merge(*args):
            return " ".join(args)

        merge_btn.click(merge, boxes, output)

        def clear():
            return [""] * count

        clear_btn.click(clear, None, boxes)

        def countup():
            return [i for i in range(count)]

        count_btn.click(countup, None, boxes, queue=False)

    with gr.Row():
        merge_btn = gr.Button("Merge")
        clear_btn = gr.Button("Clear")
        count_btn = gr.Button("Count")

    output = gr.Textbox()

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