自定义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
相关产品推荐
相关产品推荐

