首页 > 编程问答 >如何在回调中获取当前的dash ag-grid设置

如何在回调中获取当前的dash ag-grid设置

时间:2024-08-08 14:54:35浏览次数:9  
标签:python user-interface ag-grid plotly-dash

问题是,我有一个组数据,可以在破折号选项卡上展开。我想在离开选项卡时保持行/列状态、顺序、过滤器相同。我使用 dcc.Store 保存回调中的设置,然后在选项卡返回时将它们取回。然而,行状态、顺序、展开/折叠状态似乎在破折号网格中没有属性。 具体来说,我想获取当前扩展节点并在刷新/切换选项卡时将其加载出来。 我相信这是解决方案,但如何在 python 中执行此操作 https://ag-grid.zendesk.com/hc/en-us/articles/360016031851-Saving-Restoring-expanded-group-node-state- in-the-local-storage

我的默认破折号网格选项:

dashGridOptions = {
    "rowSelection": "multiple",
    "suppressAggFuncInHeader": True,
    "animateRows": False, "sideBar": sideBar, 'groupDefaultExpanded': 1, "autoGroupColumnDef": {
        "headerName": "",
        "minWidth": 300,
    }

}

我的默认列def:

[{"field": x, "rowGroup": True, "hide": True, "pivot": True,
                                "suppressColumnsToolPanel": True} for x in underlying_risk_header] + [
                                  {"field": x, "sortable": True, "filter": True, "aggFunc": "sum",
                                   "cellStyle": {
                                       "function": "params.value > 0 ? {'color': 'green'} : {'color': 'red'}"
                                   }, "valueFormatter": {"function": "d3.format(',.0f')(params.value)"}} for
                                  x in
                                  underlying_risk_cols]

保存过滤模式的回调,我想保存订单状态,展开/折叠状态。

@callback(
    Output('iday-pv_table_setting', 'data', allow_duplicate=True),
    Input('iday-pivot-table-pv', 'columnDefs'),
    Input('iday-pivot-table-pv', 'columnState'),
    Input('iday-pivot-table-pv', 'filterModel'),
    Input('iday-pivot-table-pv', 'dashGridOptions'),
    Input('iday-pivot-table-pv', 'defaultColDef'), prevent_initial_call=True
)
def save_pv_table_state(columnDefs, columnState, filterModel, dashGridOptions, defaultColDef):
    state = {
        'columnDefs': columnDefs,
        'columnState': columnState,
        'filterModel': filterModel,
        'dashGridOptions': dashGridOptions,
        'defaultColDef': defaultColDef,
    }
    return json.dumps(state)

的确,Dash AG Grid 并没有直接提供属性来获取行/列的展开/折叠状态。你需要利用 AG Grid 的 API 和 Dash 回调机制来实现。以下是一种可行方案:

1. 使用 JavaScript 获取和设置展开状态

你需要使用 AG Grid 的 API 来获取和设置展开状态。

  • 获取展开状态: 使用 gridApi.getExpandedNodes() 方法获取当前展开的节点列表。每个节点都包含一个 id 属性,可以用来唯一标识该节点。
  • 设置展开状态: 使用 gridApi.ensureNodeVisible() 方法展开指定节点。

2. 通过 JavaScript 代码与 Dash 交互

  • 从 Dash 传数据到 JavaScript: 可以使用 dash_clientside.no_update 装饰器创建客户端回调函数,并在回调函数中使用 dash_clientside.Client.props 获取 Dash 组件的属性值。
  • 从 JavaScript 传数据到 Dash: 可以使用 window.dash_clientside.emit 方法触发 Dash 回调函数,并将数据作为参数传递。

3. 创建 Dash 回调函数

你需要创建两个 Dash 回调函数:

  • 保存展开状态: 当用户切换选项卡时,触发该回调函数保存当前展开的节点 ID 列表到 dcc.Store 组件。
  • 恢复展开状态: 当用户返回选项卡时,触发该回调函数从 dcc.Store 组件读取保存的节点 ID 列表,并使用 gridApi.ensureNodeVisible() 方法展开对应的节点。

代码示例:

import dash
import dash_ag_grid as dag
import dash_html_components as html
import dash_core_components as dcc
import json

app = dash.Dash(__name__)

# ... 其他代码 ...

# 创建 AG Grid 组件
dag.AgGrid(
    id="my-grid",
    # ... 其他配置 ...
)

# 创建 dcc.Store 组件用于存储展开状态
dcc.Store(id="grid-expanded-nodes")

# 保存展开状态的回调函数
@app.callback(
    Output("grid-expanded-nodes", "data"),
    Input("my-grid", "onGridReady"),
)
def save_expanded_nodes(grid_ready):
    if grid_ready:
        # 使用 JavaScript 获取展开的节点 ID 列表
        return dash.no_update
    return dash.no_update

# 恢复展开状态的回调函数
@app.callback(
    Output("my-grid", "dashGridOptions"),
    Input("grid-expanded-nodes", "data"),
    State("my-grid", "onGridReady"),
)
def restore_expanded_nodes(expanded_nodes_json, grid_ready):
    if grid_ready and expanded_nodes_json:
        expanded_nodes = json.loads(expanded_nodes_json)
        # 使用 JavaScript 展开对应的节点
        return dash.no_update
    return dash.no_update

# ... 其他代码 ...

JavaScript 代码 (在 assets 文件夹中创建):

// 获取展开的节点 ID 列表
window.dash_clientside.saveExpandedNodes = function(gridApi) {
  const expandedNodes = gridApi.getExpandedNodes();
  const expandedNodeIds = expandedNodes.map(node => node.id);
  window.dash_clientside.emit('save-expanded-nodes', expandedNodeIds);
}

// 展开指定的节点
window.dash_clientside.restoreExpandedNodes = function(gridApi, expandedNodeIds) {
  expandedNodeIds.forEach(nodeId => {
    gridApi.ensureNodeVisible(nodeId);
  });
}

注意:

  • 你需要根据实际情况修改代码,例如组件 ID、数据结构等。
  • 确保已正确配置 assets 文件夹和 JavaScript 文件路径。

希望以上方案能够帮助你解决问题!

标签:python,user-interface,ag-grid,plotly-dash
From: 78841812

相关文章

  • Python爬虫实战:实时微信推送奥运奖牌榜信息
    最近奥运会正在巴黎如火如荼地进行。为了能第一时间获得我国运动健儿的获奖情况,我给大家分享一个python爬虫项目——实时微信推送奥运奖牌榜信息。爬虫每隔5分钟抓取一次奥林匹克官网奖牌榜数据,对比上次抓取的数据,如果奖牌数量或者排名有变化,就将新的获奖信息推送到......
  • 基于Python实现可视化分析中国500强排行榜数据的设计与实现
    基于Python实现可视化分析中国500强排行榜数据的设计与实现“DesignandImplementationofVisualAnalysisforChina’sTop500CompaniesRankingDatausingPython”完整下载链接:基于Python实现可视化分析中国500强排行榜数据的设计与实现文章目录基于Python......
  • python使用selenium和PyPDF2保存多个html页面为pdf
    检索资料时看到比较完备的资料,想着要把所有页面保存下来。正好使用下requests和BeautifulSoup库获取和解析所有的静态页,把静态页保存为单个pdf文件,然后再把所有的pdf文件合并起来生成1个PDF文档。本来想使用python子进程调用wkhtmltopdf工具把静态页生成为单个pdf,然而如此一来pdf......
  • Python编码规范常用技巧
    Python编码规范常用技巧开场白:Python编码规范的艺术从一团乱麻到井然有序:我的Python代码进化史PEP8:Python编码规范的圣经为什么遵循编码规范如此重要命名约定:给你的代码起个好名字变量名:不只是标识符那么简单函数命名:让意图一目了然类与方法:面向对象的命名艺术代码结......
  • Python实现游戏中的音效制作与环境声音设计
    Python实现游戏中的音效制作与环境声音设计开场白:让声音活起来——游戏音频的魅力为什么游戏中的声音如此重要?个人体验分享:那些让人难忘的游戏音效Python在音频处理中的应用概览基础篇:Python环境搭建与音频库介绍快速入门:安装Python及必备音频处理库库推荐:pydub、soundf......
  • python拆分PDF文件
    先占个空,后面在慢慢更新下面这个代码实现讲一个PDF文件拆分成多个文件importPyPDF2defsplit_pdf(input_pdf_path,output_prefix,start_page,end_page):"""分割PDF文件为多个小的PDF文件,每个文件包含原始文档的一部分页面。:paraminput_pdf_path:输入......
  • Python动态执行代码
    在Python中,动态执行代码是一个强大的特性,它允许程序在运行时编译和执行字符串或存储在文件、数据库等中的代码。这种能力使得Python在需要高度灵活性和动态性的应用中特别有用,比如科学计算、数据分析、Web开发以及自动化脚本等。下面,我将详细介绍Python中动态执行代码的几种......
  • 在Python中,模块(Module)和包(Package)
    在Python中,模块(Module)和包(Package)是组织代码、提高代码复用性、促进代码维护的两种重要机制。它们各自扮演着不同的角色,但又紧密相连,共同构成了Python程序架构的基础。以下将详细阐述Python中模块和包的概念及其区别。一、模块(Module)的概念在Python中,模块是一个包含了Pyth......
  • 工地安全帽智能识别系统 Python
    工地安全帽智能识别系统通过AI深度学习技术,工地安全帽智能识别系统实现对工地人员的安全帽反光衣穿戴进行自动实时识别和检测,当工地安全帽智能识别系统发现现场人员违规未按要求戴安全帽反光衣及不安全行为时,不需人为干预,工地安全帽智能识别系统自动抓拍触发告警,提醒安全管理人......
  • 20.python变量
    python之局部变量和全局变量一、python中的变量(1)局部变量定义:在函数内定义的变量就局部变量(2)全局变量定义:在函数内外都可以引用定义的变量就全局变量(3)备注:当局部变量和全局变量在一起时,局部变量要比全局变量优先级级高案例:a=200#全局变量defhs():a=100#局部变量......