Matplotlib/Tkinter-自定义工具栏工具提示 [英] Matplotlib/Tkinter - customizing toolbar tooltips

查看:120
本文介绍了Matplotlib/Tkinter-自定义工具栏工具提示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I created an application based on Tkinter that uses Matplotlib for plotting a waveform. I wonder how I could change the tooltips for the Matplotlib toolbar buttons (I need to translate the English descriptions since my application is in Czech language). I'd also like to change/translate or just remove the descriptions (pan/zoom, zoom rect) that appear next to the toolbar panel when clicking on the zoom or pan button.

我发现了一些有关如何从工具栏添加或删除按钮的有用提示,但是没有找到有关自定义工具提示/描述的任何建议.我认为这与前一种情况相似,因为我需要基于NavigationToolbar2TkAgg创建一个新的工具栏类并以某种方式对其进行修改.关于如何做到这一点的任何建议?预先非常感谢.

I found some useful tips concerning how to add or remove buttons from the toolbar, but haven't found any advice for customizing the tooltips/descriptions. I think it would be similar to the former case in that I'd need to create a new toolbar class based on NavigationToolbar2TkAgg and modify it in some way. Any advices on how this could be done? Many thanks in advance.

推荐答案

PART 1

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

So this should be pretty straight forward. The NavigationToolbar2TkAgg class inherits from NavigationToolbar2 which can be found in matplotlib.backend_bases. If you look at NavigationToolbar2TkAgg, you will see that the pop-up text for the buttons is stored in an attribute called self.toolitems. This attribute is inherited from the base class, where it is defined as:

# 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版本.

The second item in each tuple is the text that is pops up when you mouse-over the button. To override this, just subclass and make your own version of toolitems.

例如(带有填充文本):

For example (with filler text):

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图形,但是当您将鼠标悬停在按钮上时,您将得到类似的东西:

This should give you a normal embedded matplotlib figure, but when you mouse-over the buttons you will get something like:

PART 2

问题的第二部分不太优雅. 平移/缩放"和缩放矩形"的文本被硬编码到工具栏的panzoom方法中.实际的文本保存在工具栏的self.mode属性中.覆盖产生的结果的最简单方法是为基类panzoom方法创建子类包装.

The second part of the question is less elegant. The text for "pan/zoom" and "zoom rect" is hardcoded into the pan and zoom methods of the toolbar. The actual text is held in the self.mode attribute of the toolbar. The easiest way to overwrite what this produces is to make subclass wrappers for the baseclass pan and zoom methods.

这些包装器从上方进入CustomToolbar类,例如:

These wrappers go in the CustomToolbar class from above like:

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方法以捕获并翻译特定的文本位.

This is just one way to do this, another might be to wrap the set_message method to catch and translate specific bits of text.

这篇关于Matplotlib/Tkinter-自定义工具栏工具提示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆