在 Tkinter 中更改 matplotlib 的 NavigationToolbar 大小

Change NavigationToolbar size of matplotlib in Tkinter

有没有办法在将 matplotlib 嵌入到 Tkinter 中时更改 NavigationToolbar 的大小(例如 zoom 按钮的大小)?我试过在config中设置关键字widthheight,但是没有用。那么,有什么建议吗?

更新

import matplotlib
import os
import Tkinter as tk

from matplotlib.backends.backend_tkagg import NavigationToolbar2TkAgg as NavigationToolbar
from matplotlib.backends.backend_tkagg import ToolTip

class CustomedToolbar(NavigationToolbar):
    def __init__(self, canvas, root):
        NavigationToolbar.__init__(self,canvas,root)

def _Button(self, text, file, command, extension='.ppm'):
    img_file = os.path.join(matplotlib.rcParams['datapath'], 'images', file + extension)
    im = tk.PhotoImage(master=self, file=img_file)
    im = im.zoom(3, 3)
    im = im.subsample(4, 4)
    # Do stuff with im here
    b = tk.Button(master=self, text=text, padx=2, pady=2, image=im, command=command)
    b._ntimage = im
    b.pack(side=tk.LEFT)
    return b

def _init_toolbar(self):
    xmin, xmax = self.canvas.figure.bbox.intervalx
    height, width = 50, xmax-xmin
    tk.Frame.__init__(self, master=self.window,
                                            width=int(width), height=int(height),
                                            borderwidth=2)

    self.update()  # Make axes menu

    for text, tooltip_text, image_file, callback in self.toolitems:
        if text is None:
            # spacer, unhandled in Tk
            pass
        else:
            button = self._Button(text=text, file=image_file, command=getattr(self, callback))
            if tooltip_text is not None:
                ToolTip.createToolTip(button, tooltip_text)

    self.message = tk.StringVar(master=self)
    self._message_label = tk.Label(master=self, textvariable=self.message)
    self._message_label.pack(side=tk.RIGHT)
    self.pack(side=tk.BOTTOM, fill=tk.X)

这是我的努力。感谢 fhdrsdg。

如果我理解正确,您可以创建一个自定义工具栏 class,它继承自 NavigationToolbar2TkAgg。您可以更改创建按钮的 _Button 定义:

class CustomToolbar(NavigationToolbar2TkAgg):
    def _Button(self, text, file, command, extension='.ppm'):
        img_file = os.path.join(matplotlib.rcParams['datapath'], 'images', file + extension)
        im = Tk.PhotoImage(master=self, file=img_file)
        # Do stuff with im here
        b = Tk.Button(
            master=self, text=text, padx=2, pady=2, image=im, command=command)
        b._ntimage = im
        b.pack(side=Tk.LEFT)
        return b

如您所见,这里有一个图片文件im,就是您要缩小的图片。 Tk.PhotoImage 只有 subsample() 可以执行此操作,这可以让您将图像缩小一整倍。例如,您可以 im = im.subsample(2, 2) 使图像变小两倍(或 im = im.zoom(2, 2) 使图像变大两倍)。

也许更精通 PIL 的人可以告诉您是否有办法使用 PIL 来制作您想要的任何尺寸的图像,但我无法让它工作。