如何自定义Gradio应用界面并基于首个界面输出触发函数
问题描述
我希望基于function1的输出触发function2,目前通过两个Interface结合Blocks实现了该功能,但不想使用额外界面。
我的尝试代码
# 定义函数 def function1(input1): # 你的代码 return 'hello' def function2(create_ticket): # 你的代码 return 'Your ticket has been created 🏆' interface1 = gr.Interface(fn=listen_audio, inputs=gr.Audio(sources="microphone", type="filepath"),outputs="text") interface2 = gr.Interface(fn=function2, inputs=["checkbox"], outputs="text") lst = [x for x in dir(interface1) if '__' not in x] # 使用Blocks组合界面 with gr.Blocks() as demo: with gr.Row(): with gr.Column(): interface1.render() with gr.Column(): interface2.render() demo.launch()
期望实现的代码(示例)
import gradio as gr def listen_audio(input1): return 'problem' def function2(output_of_listen_audio_function): return 'Ticket has been created' demo = gr.Interface(fn=listen_audio, inputs=gr.Audio(sources="microphone", type="filepath"), outputs="text", flagging_options=["Create Ticket"], # allow_flagging = "never" ) demo.launch()

解决方案
方法1:使用Blocks组件(推荐,灵活可控)
用Blocks可以在同一个界面内直接关联音频处理结果和工单创建逻辑,不需要拆分多个Interface:
import gradio as gr def listen_audio(input1): # 替换为你的音频实际处理逻辑 return '检测到的问题描述' def function2(problem_text): # 替换为创建工单的实际业务逻辑 return f"已为问题「{problem_text}」创建工单 🏆" with gr.Blocks() as demo: # 音频输入组件 audio_input = gr.Audio(sources="microphone", type="filepath", label="麦克风输入") # 显示音频处理结果的文本框 result_text = gr.Textbox(label="处理结果") # 触发工单创建的按钮 create_ticket_btn = gr.Button("创建工单") # 显示工单创建状态的文本框 ticket_result = gr.Textbox(label="工单状态") # 音频输入变化时自动处理并显示结果 audio_input.change(fn=listen_audio, inputs=audio_input, outputs=result_text) # 点击按钮时,把处理结果传给function2生成工单 create_ticket_btn.click(fn=function2, inputs=result_text, outputs=ticket_result) demo.launch()
方法2:基于Interface的标记功能实现
如果想沿用你给出的带flagging_options的思路,可以通过自定义标记事件触发function2:
import gradio as gr def listen_audio(input1): return '检测到的问题描述' def function2(problem_text): return f"已为问题「{problem_text}」创建工单 🏆" def handle_flag(flag_data, flag_option): if flag_option == "Create Ticket": # 提取音频处理后的结果 problem_text = flag_data[1] return function2(problem_text) return "" demo = gr.Interface( fn=listen_audio, inputs=gr.Audio(sources="microphone", type="filepath"), outputs="text", flagging_options=["Create Ticket"], flagging_callback=gr.CSVLogger() # 可替换为自定义日志回调 ) # 绑定标记事件,触发工单创建 demo.flagging_event(fn=handle_flag, inputs=[demo.data, demo.flag_option], outputs=gr.Textbox(label="工单状态")) demo.launch()
内容的提问来源于stack exchange,提问作者vishvas chauhan
相关产品推荐
相关产品推荐

