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

GTK后端场景下修改matplotlib导航工具栏图标搜索路径的问题

Matplotlib GTK后端自定义工具栏图标搜索路径问题

Stack Overflow上已有类似相关问题,但均不涉及GTK后端场景,也没有修改后端图标搜索路径的相关需求,GTK后端的相关代码可查看Matplotlib官方仓库对应实现。

问题背景

我正在使用PyInstaller打包Python脚本,需要修改工具栏图标的原因是部分Windows设备上导航工具栏的图标显示为损坏链接,即便图标已经存放在理论上的正确路径:

\dist\<script name>\matplotlib\mpl-data\images\<image_file>-symbolic.svg

且图标格式符合GTK后端要求的f'{image_file}-symbolic.svg'规范。我排查该问题很久没有进展,因此想将图标存放在自己指定的路径下,强制脚本调用该路径下的图标,规避可能存在的环境变量或路径异常问题。

通过自定义toolitems我可以成功修改提示文本和图标名称,但无法修改图标的搜索路径,toolitems的第三个参数用于指定图标,其格式要求如下:

要添加到工具栏的toolitems列表,格式为:
(
   text, # 按钮文本(通常对用户不可见)
   tooltip_text, #  hover时显示的提示文本(支持的场景下生效)
   image_file, # 按钮对应的图标名称(不含扩展名)
   name_of_method, # NavigationToolbar2中要调用的方法名
)

看起来图标必须存放在官方预期路径下,且名称不能带扩展名。GTK后端加载图标的对应代码如下:

image = Gtk.Image.new_from_gicon(
    Gio.Icon.new_for_string(
        str(cbook._get_data_path('images',
                                 f'{image_file}-symbolic.svg'))),
    Gtk.IconSize.LARGE_TOOLBAR)

如果将svg图标放在上述代码获取的路径中,文件名加上-symbolic后缀即可正常工作。但我想知道是否可以使用后端默认目录之外的路径加载图标?我当前自定义工具栏的代码如下:

from matplotlib.backends.backend_gtk3 import NavigationToolbar2GTK3

class MyToolbar(NavigationToolbar2GTK3):
  def __init__(self, figure_canvas, window):
    self.toolitems = ( 
        ('Home', 'Reset original view', 'home', 'home'),
        ('Back', 'Back to  previous view', 'back', 'back'),
        ('Forward', 'Forward to next view', 'forward', 'forward'),
        (None, None, None, None),
        ('Pan', 'Pan axes with left mouse, zoom with right', 'move', 'pan'),
        ('Zoom', 'Zoom to rectangle', 'zoom_to_rect', 'zoom'),
        ('Subplots', 'Configure subplots', 'subplots', 'configure_subplots'),
        (None, None, None, None),
        ('Save', 'Save the figure', 'filesave', 'save_figure'),
        )

    NavigationToolbar2GTK3.__init__(self, figure_canvas, window)

self.navigation_toolbar = MyToolbar(self._gtkFigure, main)
self.navigation_toolbar.update()

我推测部分设备上图标损坏的原因是后端调用的cbook._get_data_path返回路径异常,所以如果可以在脚本中修改该路径,或许可以修复该问题,恳请各位提供相关解决方案或思路。

补充排查结果

  • 进一步排查后发现cbook中的_get_data_path实际上是调用matplotlib.get_data_path(),从Matplotlib官方相关issue来看,Matplotlib暂不支持使用自定义数据路径(没有对应的.set_data_path()方法)。
  • 有贡献者针对Tkinter后端给出建议:“获取原生tk部件,调用iconphoto()等相关方法修改”,但我没有使用Tkinter后端,不知道该如何在GTK后端实现同类操作。
  • 我确认上述的自定义toolitems方案无法实现自定义路径加载图标的需求,需要其他实现方案。

内容的提问来源于stack exchange,提问作者Leigh K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:24:03