Matplotlib/Tkinter-自定义工具栏工具提示

2024-05-17 05:04:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个基于Tkinter的应用程序,它使用Matplotlib绘制波形。我想知道如何更改Matplotlib工具栏按钮的工具提示(我需要翻译英文描述,因为我的应用程序是捷克语)。我还想更改/翻译或删除在单击缩放或平移按钮时出现在工具栏面板旁边的描述(pan/zoomzoom rect)。

我找到了一些关于如何在工具栏中添加或删除按钮的有用提示,但是还没有找到任何自定义工具提示/说明的建议。我认为这与前一种情况类似,因为我需要基于NavigationToolbar2TkAgg创建一个新的工具栏类并以某种方式对其进行修改。有什么建议可以这么做吗?多谢提前。


Tags: 工具rect应用程序面板matplotlibtkinter绘制情况
1条回答
网友
1楼 · 发布于 2024-05-17 05:04:38

第1部分

所以这应该很直接。NavigationToolbar2TkAgg类继承自NavigationToolbar2,可以在matplotlib.backend_bases中找到。如果查看NavigationToolbar2TkAgg,您将看到按钮的弹出文本存储在名为self.toolitems的属性中。此属性继承自基类,定义为:

# list of toolitems to add to the toolbar, format is:                                                                             
# (                                                                                                                               
#   text, # the text of the button (often not visible to users)                                                                   
#   tooltip_text, # the tooltip shown on hover (where possible)                                                                   
#   image_file, # name of the image for the button (without the extension)                                                        
#   name_of_method, # name of the method in NavigationToolbar2 to call                                                            
# )                                                                                                                               
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'),
    (None, None, None, None),
    ('Subplots', 'Configure subplots', 'subplots', 'configure_subplots'),
    ('Save', 'Save the figure', 'filesave', 'save_figure'),
    )

每个元组中的第二个项是鼠标悬停在按钮上时弹出的文本。要重写这个,只需子类化并创建自己的toolitems版本。

例如(带填充文字):

import numpy as np
import Tkinter as tk
import matplotlib as mpl
from matplotlib.patches import Rectangle
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg

# custom toolbar with lorem ipsum text
class CustomToolbar(NavigationToolbar2TkAgg):
    def __init__(self,canvas_,parent_):
        self.toolitems = (
            ('Home', 'Lorem ipsum dolor sit amet', 'home', 'home'),
            ('Back', 'consectetuer adipiscing elit', 'back', 'back'),
            ('Forward', 'sed diam nonummy nibh euismod', 'forward', 'forward'),
            (None, None, None, None),
            ('Pan', 'tincidunt ut laoreet', 'move', 'pan'),
            ('Zoom', 'dolore magna aliquam', 'zoom_to_rect', 'zoom'),
            (None, None, None, None),
            ('Subplots', 'putamus parum claram', 'subplots', 'configure_subplots'),
            ('Save', 'sollemnes in futurum', 'filesave', 'save_figure'),
            )
        NavigationToolbar2TkAgg.__init__(self,canvas_,parent_)


class MyApp(object):
    def __init__(self,root):
        self.root = root
        self._init_app()

    # here we embed the a figure in the Tk GUI
    def _init_app(self):
        self.figure = mpl.figure.Figure()
        self.ax = self.figure.add_subplot(111)
        self.canvas = FigureCanvasTkAgg(self.figure,self.root)
        self.toolbar = CustomToolbar(self.canvas,self.root)
        self.toolbar.update()
        self.plot_widget = self.canvas.get_tk_widget()
        self.plot_widget.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
        self.toolbar.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
        self.canvas.show()

    # plot something random
    def plot(self):
        self.ax.imshow(np.random.normal(0.,1.,size=[100,100]),cmap="hot",aspect="auto")
        self.figure.canvas.draw()

def main():
    root = tk.Tk()
    app = MyApp(root)
    app.plot()
    root.mainloop()

if __name__ == "__main__":
    main()

这将为您提供一个普通的嵌入式matplotlib图形,但是当您将鼠标悬停在按钮上时,您将得到如下结果:

Custom toolbar text example

第2部分

问题的第二部分不那么优雅。“pan/zoom”和“zoom rect”的文本硬编码到工具栏的panzoom方法中。实际文本保存在工具栏的self.mode属性中。最简单的覆盖方法是为基类panzoom方法生成子类包装器。

这些包装器从上面进入CustomToolbar类,如下所示:

def pan(self):
    NavigationToolbar2TkAgg.pan(self)
    self.mode = "I'm panning!" #<--- whatever you want to replace "pan/zoom" goes here
    self.set_message(self.mode)

def zoom(self):
    NavigationToolbar2TkAgg.zoom(self)
    self.mode = "I'm zooming!" #<--- whatever you want to replace "zoom rect" goes here
    self.set_message(self.mode)

这只是一种方法,另一种方法可能是包装set_message方法来捕获和翻译特定的文本位。

相关问题 更多 >