在 Tkinter 中更改 matplotlib 的 NavigationToolbar 大小
Change NavigationToolbar size of matplotlib in Tkinter
有没有办法在将 matplotlib 嵌入到 Tkinter 中时更改 NavigationToolbar 的大小(例如 zoom
按钮的大小)?我试过在config
中设置关键字width
和height
,但是没有用。那么,有什么建议吗?
更新
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 来制作您想要的任何尺寸的图像,但我无法让它工作。
有没有办法在将 matplotlib 嵌入到 Tkinter 中时更改 NavigationToolbar 的大小(例如 zoom
按钮的大小)?我试过在config
中设置关键字width
和height
,但是没有用。那么,有什么建议吗?
更新
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 来制作您想要的任何尺寸的图像,但我无法让它工作。