最强前端gradio开发笔记, gradio如何添加分页功能 Field required [type=missing, input_value={'path': bug修复 gradio表格的点击触发详细展示功能.

样式的究极解决方案:
https://www.gradio.app/guides/theming-guide

如果里面text等设置的还不满意, 可以直接改源码, 或者复写即可.都不难, 只需要python看源码的一点功力即可自定义化样式.66666666666666666

image

比如我可以把字体强制干这么小, 随意拿捏. 玩转.

阿里云这狗东西总会卡死:
解决方法.
image

进网页后台, 停止服务器,然后打开即可

gradio 给dataframe添加分页功能

neirong=gr.Dataframe(visible=False,)
jieguo2=gr.Dataset(
      components=[neirong], 

                       )

  
def chaxunf(shuruD,shuchuD):  #查询就肯定是第0项开始.
    print('参数是')
    #=================抽取里面数据的方法:
    shuju1=shuruD.__array__()
    shuju2=shuchuD.__array__()
    print('触发了chaxunf')
    aaa=pd.DataFrame(med_data[0:nums_per_page])
    return  gr.update(value=aaa, visible=True)
  
def chaxunf2(p,neirong):  #下一页
    print('参数是')
    #=================抽取里面数据的方法:
    # shuju1=shuruD.__array__()
    # shuju2=shuchuD.__array__()
    # print('触发了chaxun2')
    # aaa=pd.DataFrame(med_data[0:nums_per_page])
    p+=nums_per_page #直接修改就行了.
    p=max(p,len(med_data))
    aaa=pd.DataFrame(med_data[p:p+nums_per_page])
    return  p,gr.update(value=aaa)
  
  
def chaxunf3(p,neirong):  #上一页.
    print('参数是')
    #=================抽取里面数据的方法:
    shuju1=shuruD.__array__()
    shuju2=shuchuD.__array__()
    p-=nums_per_page #直接修改就行了.
    p=min(p,0)
    aaa=pd.DataFrame(med_data[p:p+nums_per_page])
    return  p,gr.update(value=aaa)



gradio写入普通文字:
gr.HTML('<div style="text-align: center;">页数:</div>')

gradio展示数据的表格写法. 
gr.Dataframe(visible=True,interactive=False)
如果交互=True,那么表格可以自己随意修改内容了.不是我们要的.







Field required [type=missing, input_value={'path':
这个bug来自于:
button.click类型的传参.

def chaxunf2(p,shuruD,shuchuD,yeshu):  #下一页
    print('参数是')
    p+=nums_per_page #直接修改就行了.
    p=min(p,len(med_data))
    yema=int(p)//nums_per_page+1 # =====注意我们p是内容索引从0开始, 页码从1开始.
    aaa=pd.DataFrame(med_data[p:p+nums_per_page])
    zongyeshu=(len(med_data)+nums_per_page-1)//nums_per_page
    yeshu=yeshu[:yeshu.index('页数:')+3]+f'{yema}/{zongyeshu}</div>'
    return  p,gr.update(value=aaa),gr.update(value=yeshu)

p=tmp_page = gr.State(value=0)
shuruD=gr.dataframe
shuchu=gr.dataframe
yeshu=gr.html
只有这样排列才能正确传参, 也就是state这种状态要优先于dataframe传入才行!!!!!!!!!!!!!!!!





以上两个问题, 做dataframe控件的分页时候一定遇到这个问题. 希望能帮大家避坑, 提升开发效率. 我也是逐行debug, 最后很幸运找到了bug点.希望gradio下个版本官方能修改这个bug.
我目前用的4.13版本.



再一个是起服务的坑: 最近vscode链接服务器, 莫名奇妙占用超大内存,所以vscode写完代码之后, 切成xterm来看服务器情况, 关闭vscode.


========解决这个问题的还有一个更狠的方法,避免所有bug, 那就是直接随便写一个gr组件往里面存值, 比如存一个gr.Dataframe用来做缓存, 那么我们直接visible=False即可.页面也看不到,信息也保存到会话里面了.

==如果你用gr.state来维护一个变量, 那么就需要维持这个原则, state变量传入传出都需要排列在gr.textbox, gr.dataframe这种带名字空间的前面传入.比如这种neirong.select(selectf,[detail_info3,detail_info,neirong],[detail_info3,neirong]) detail_info3是一个state变量, detail_info是gr.dataframe变量.

不要用python的对象来存东西, python的对象在这里是当做所有浏览器访问时候的全局变量来使用的, 基本没有这种应用场景, 我们所有的业务基本都需要各个浏览器用户之间的环境沙盒化.

突然发现
https://hf-mirror.com/datasets/TIGER-Lab/MMLU-Pro
这种页面的点击之后展示详细的功能其实不难.

整体思路:
创建一个变量来存每次返回结果的详细内容.
默认返回缩略内容
然后点击响应就是用select方法,里面点击后把dataframe当前内容展开.
全部内容用一个dataframe存visible=False, 展开后的直接用界面里dataframe存visible=True.
再配一个gr.state里面放一个字典,来维护到底那些点开了,那些缩起来了.
配合自动换行功能, 已经彻底实现了.没啥大难度.

自动换行

neirong=gr.Dataframe(visible=False,interactive=False,wrap=True,scale=1,type='polars')

让按钮控制他下方的表格:



import gradio as gr
with gr.Blocks(theme=gr.themes.Soft()) as demo:

    showlieming = gr.Button("Set Visible",size="sm")
    hidelieming = gr.Button("Set Invisible",size="sm", visible=False)

    lieming=gr.DataFrame(headers=None,value=[[1,2,3]],visible=False,
                         interactive=False,
                         wrap=True,scale=1,type='pandas')
    showlieming.click(lambda :(gr.DataFrame(visible=True), gr.Button(visible=False), gr.Button(visible=True)), [],[lieming, showlieming, hidelieming])
    hidelieming.click(lambda :(gr.DataFrame(visible=False), gr.Button(visible=True), gr.Button(visible=False)), [],[lieming, showlieming, hidelieming])

demo.launch()

posted on 2024-05-14 21:48  张博的博客  阅读(139)  评论(0编辑  收藏  举报

导航