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

使用register_widget()后无法从ipyaggrid获取返回数据

解决ipyaggrid在Shiny for Python中grid_data_out返回空字典的问题

在Shiny for Python环境里,直接调用grid.grid_data_out()拿不到UI端状态,核心原因是Shiny通过shinywidgets管理交互式组件的状态同步,不能直接访问组件实例属性来获取实时更新的UI数据,必须用reactive_read函数监听组件的输出状态。

具体解决步骤

  • 替换直接访问color_grid.grid_data_out的方式,改用reactive_read(color_grid, "grid_data_out")获取UI端返回的数据
  • 确保在@render.text这类reactive上下文里使用reactive_read,它会自动响应UI端的变化

修改后的完整代码

import json
import pandas as pd
import numpy as np
import urllib.request as ur

from ipyaggrid import Grid
from shiny import App, ui
from shiny import module, ui, render, reactive, event, App
from shinywidgets import register_widget, output_widget, reactive_read

app_ui = ui.page_fluid(
    ui.tags.p("grid_data_out() is always empty!"),
    ui.row(
        ui.column(4, output_widget("grid")),
        ui.column(4, ui.output_text_verbatim("txt"))
    )
)

def server(input, output, session):

    url = 'https://raw.githubusercontent.com/bahamas10/css-color-names/master/css-color-names.json'
    with ur.urlopen(url) as res:
        cnames = json.loads(res.read().decode('utf-8'))
        
    colors = []
    for k in cnames.keys():
        colors.append({'color':k, 'value':cnames[k]})
        
    colors_ref = colors[:]
    
    css_rules="""
        .color-box{
          float: left;
          width: 10px;
          height: 10px;
          margin: 5px;
          border: 1px solid rgba(0, 0, 0, .2);
        }
    """
    columnDefs = [
        {'headerName': 'Color', 'field':'color', 
         'pinned': True, 'editable': True},
        {'headerName': 'Code', 'field':'value', 'editable': False, 'cellRenderer': """
            function(params){
                return `<div><div style="background-color:${params.value}" class='color-box'></div><span>${params.value}</span></div>`
          }"""}
    ]
    
    gridOptions = {
        'columnDefs':columnDefs,
        'enableFilter':'true',
        'enableSorting':'true',
        'rowSelection':'multiple',
    }
    
    color_grid = Grid(
        width=400,
        height=250,
        grid_data=colors,
        css_rules=css_rules,
        grid_options=gridOptions,
        sync_on_edit=True,
        sync_grid=True, #default
        export_mode = 'auto'
    )
    
    register_widget("grid", color_grid)

    @output
    @render.text
    def txt():
        # 使用reactive_read获取grid的输出数据
        grid_out = reactive_read(color_grid, "grid_data_out")
        return(str(grid_out.keys()))

app = App(app_ui, server)

关键说明

  • reactive_read是Shiny widgets提供的专用函数,负责监听交互式组件的属性变化,确保能拿到UI端实时更新的状态
  • 之前调用的color_grid.get_grid()是多余操作,无需手动触发状态同步,reactive_read会自动处理这部分逻辑

内容的提问来源于stack exchange,提问作者Theodore Vadpey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:33:16