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

自定义NavigationToolbar2Tk工具栏图标:继承类方法失效求解

问题分析与解决方案

子类重写无效的原因

你重写的_set_image_for_button仅定义了自定义的path_regular变量,但完全缺失了父类方法中加载图标、将图标绑定到按钮的核心逻辑——相当于只改了路径却没把路径用起来,按钮自然还是用默认图标。

正确的子类实现方式

方式一:重写_get_image_path(推荐,更优雅)

NavigationToolbar2Tk的_get_image_path方法专门负责获取图标路径,直接重写这个方法即可,无需改动图标加载逻辑:

import os
from matplotlib.backends.backend_tkagg import NavigationToolbar2Tk

class CustomNavigationToolbar2Tk(NavigationToolbar2Tk):
    """带自定义图标的工具栏"""
    def _get_image_path(self, image_file):
        # 返回自定义图标路径,自动匹配按钮对应的图标文件名
        return os.path.join(os.path.dirname(__file__), "icons", os.path.basename(image_file))

方式二:完整重写_set_image_for_button

如果一定要重写这个方法,必须保留父类的完整逻辑,仅替换路径部分:

import os
import tkinter as tk
from matplotlib.backends.backend_tkagg import NavigationToolbar2Tk

class CustomNavigationToolbar2Tk(NavigationToolbar2Tk):
    """带自定义图标的工具栏"""
    def _set_image_for_button(self, button):
        # 自定义图标路径
        path_regular = os.path.join(os.path.dirname(__file__), "icons", os.path.basename(button._image_file))
        # 保留父类的图标加载与绑定逻辑
        img = tk.PhotoImage(file=path_regular)
        button.config(image=img)
        button._img = img  # 保留引用防止被垃圾回收

        # 若需要支持禁用状态图标,添加以下逻辑
        if hasattr(button, "_image_file_disabled"):
            path_disabled = os.path.join(os.path.dirname(__file__), "icons", os.path.basename(button._image_file_disabled))
            img_disabled = tk.PhotoImage(file=path_disabled)
            button.config(disabledimage=img_disabled)
            button._img_disabled = img_disabled

关于临时方案的说明

你直接替换父类_set_image_for_button的方式之所以有效,是因为完整覆盖了方法的全部逻辑(路径替换+图标加载绑定),但这种方式会修改父类的全局行为,所有使用NavigationToolbar2Tk的地方都会被影响,不如子类继承的方式灵活可控。

内容的提问来源于stack exchange,提问作者Artur Kryzhanovskyy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:30:57