如何更改 matplotlib 工具栏的平移和缩放按钮的模式

How to change modes of the pan and zoom buttons of a matplotlib toolbar

我在 tkinter 应用程序中嵌入了一个 matplotlib 图,并在其上附加了一个自定义工具栏。 这是工具栏的代码:

class CustomToolbar(NavigationToolbar2Tk):

    def __init__(self, canvas_, parent_, background_color):

        self.toolitems = (
            ('Home', 'Réinitialiser la vue', 'home', 'home'),
            ('Back', 'Retour à la vue précédente', 'back', 'back'),
            ('Forward', 'Avancer à la vue suivante', 'forward', 'forward'),
            (None, None, None, None),
            ('Pan', 'Clic gauche : Déplacer le graphe\nClic droit: Dilater/compresser les axes', 'move', 'pan'),
            ('Zoom', 'Zoomer', 'zoom_to_rect', 'zoom'),
            (None, None, None, None)
        )

        super().__init__(canvas_, parent_)

        self.background_color = background_color
        self.configure(bg=self.background_color)
        self.get_message_label().config(background=self.background_color)
        self.update()

    def get_message_label(self):
        return self._message_label

    def pan(self):
        super().pan(self)
        self.mode = "Déplacer/Dilater"
        self.set_message(self.mode)

    def zoom(self):
        super().zoom(self)
        self.mode = "Zoomer"
        self.set_message(self.mode)

我重新定义了 panzoom 方法,以便在平移或缩放按钮处于活动状态时设置新模式,我这样做是因为我想更改 _message_label。我按照这个问题的答案做了:Matplotlib/Tkinter - customizing toolbar tooltips.

但是,此解决方案在 2020 年似乎不起作用,因为模式在 matplotlib.backend_bases 中的 _Mode class 中预定义为 class 成员:

class _Mode(str, Enum):
    NONE = ""
    PAN = "pan/zoom"
    ZOOM = "zoom rect"

    def __str__(self):
        return self.value

    @property
    def _navigate_mode(self):
        return self.name if self is not _Mode.NONE else None

我试图在我的脚本中更改 class 成员 PAN 和 ZOOM 但是 Enum class 的 __setattr__ 方法不允许我:

    def __setattr__(cls, name, value):
        """Block attempts to reassign Enum members.

        A simple assignment to the class namespace only changes one of the
        several possible ways to get an Enum member from the Enum class,
        resulting in an inconsistent Enumeration.

        """
        member_map = cls.__dict__.get('_member_map_', {})
        if name in member_map:
            raise AttributeError('Cannot reassign members.')
        super().__setattr__(name, value)

那么是否可以简单地更改 class 成员 PAN 和 ZOOM 而不会弄乱 matplotlib.backend_bases.py 文件?

感谢您的宝贵时间,

保罗

好的,所以我找到了一个解决方案,它似乎像这样包装 NavigationToolbar2Tk class 的 set_message 时有效:

    def set_message(self, s):
        if s == "pan/zoom":
            self.message.set("Déplacer/Dilater")

        elif s == "zoom rect":
            self.message.set("Zoomer")

我在问题中提到的 post 中指出了此解决方案,但我想我根本没有看到它。