这个方法只能在gradio前后端都在一台机器上的时候生效(也就是在本地启动gradio之后在本地访问127.0.0.1/7860)。将gradio部署在远程服务器,然后在本地访问的时候这个方法没用。
思路:在后端异步调用Python内置库tkinter的filedialog
import gradio as gr
import os, asyncio
import tkinter as tk
from tkinter.filedialog import askopenfilename, askdirectory, asksaveasfilename, askopenfilenames
def tk_window_asksavefile(init_dir=os.getcwd(), suffix = '') -> str:
window = tk.Tk()
window.wm_attributes('-topmost', 1)
window.withdraw()
filename = askopenfilename(initialdir=init_dir, filetypes=[('', suffix)])
return filename
async def tk_asksavefile_asy(init_dir = os.getcwd(), suffix = '') -> str:
fname = await asyncio.to_thread(tk_window_asksavefile, init_dir, suffix)
return fname
with gr.Blocks() as demo:
norm_input_text = gr.Text(label='Input tif for normalization')
norm_input_btn = gr.Button('Select input tif')
norm_input_btn.click(tk_asksavefile_asy, inputs=[], outputs=[norm_input_text])
demo.queue(concurrency_count=1022, max_size=2044).launch(server_name="127.0.0.1",inbrowser=True,quiet=True,
share=False)
这里演示的是选择文件路径,选择文件夹、保存文件或者多个文件换一下tk的函数就可以了。
效果如下:
这个思路也可以适用于其他前后端在一台机器上部署的算法演示或使用平台~