如何更改 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)
我重新定义了 pan
和 zoom
方法,以便在平移或缩放按钮处于活动状态时设置新模式,我这样做是因为我想更改 _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 中指出了此解决方案,但我想我根本没有看到它。
我在 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)
我重新定义了 pan
和 zoom
方法,以便在平移或缩放按钮处于活动状态时设置新模式,我这样做是因为我想更改 _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 中指出了此解决方案,但我想我根本没有看到它。