You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NiceGui库在表格单元格中添加按钮?解决序列化报错

解决NiceGui表格单元格添加按钮的JSON序列化报错问题

报错原因

直接将Python函数buttonClick传入cellRendererParams的onClick参数会触发JSON序列化错误——因为Python函数无法被序列化成JSON格式,而NiceGui需要将表格配置转换为JSON发送给前端渲染。

解决方案

方法1:使用Python自定义单元格渲染器

直接在Python中生成按钮组件,绑定点击事件,避免传递无法序列化的函数:

from nicegui import ui

def button_click(row_data):
    print(f"点击了任务ID: {row_data['taskId']}")

table = ui.table({
    'columnDefs': [
        {'headerName': 'Task id', 'field': 'taskId'},
        {
            'headerName': 'Info', 
            'field': 'info', 
            # 用lambda作为渲染器,创建按钮并绑定点击逻辑
            'cellRenderer': lambda params: ui.button('Check', on_click=lambda: button_click(params.data)).render()
        },
    ],
    'rowData': [
        {'taskId': 1},
        {'taskId': 2},
    ],
})

ui.run()

这种方式通过lambda渲染器直接生成ui.button组件,点击事件会触发Python端的button_click函数,同时能获取当前行的数据params.data。

方法2:结合ag-grid原生渲染器与自定义事件

利用ag-grid的buttonRenderer,通过自定义事件名绑定Python端的回调函数:

from nicegui import ui

def button_click(e):
    # 从事件参数中获取行数据
    print(f"点击了任务ID: {e.args['data']['taskId']}")

table = ui.table({
    'columnDefs': [
        {'headerName': 'Task id', 'field': 'taskId'},
        {
            'headerName': 'Info', 
            'field': 'info',
            'cellRenderer': 'buttonRenderer',
            'cellRendererParams': {
                'label': 'Check',
                # 定义自定义事件名,而非直接传Python函数
                'clickEvent': 'check_button_click'
            }
        },
    ],
    'rowData': [
        {'taskId': 1},
        {'taskId': 2},
    ],
})

# 监听表格的自定义事件
table.on('check_button_click', button_click)

ui.run()

这种方式通过字符串类型的事件名传递配置,避免JSON序列化问题,同时通过table.on绑定Python端的处理函数,实现点击交互。

内容的提问来源于stack exchange,提问作者Stan Sakun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:45:45