使用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
相关产品推荐
相关产品推荐

