Matplotlib + PyQt5, добавьте собственные инструменты на панель инструментов.Python

Программы на Python
Anonymous
Matplotlib + PyQt5, добавьте собственные инструменты на панель инструментов.

Сообщение Anonymous »

Я разрабатываю приложение PYQt5 со встроенным холстом matplotlib. Идея состоит в том, что пользователю предоставляется изображение, и затем пользователь может нарисовать на нем прямоугольники. Я хотел бы реализовать это, добавив новый инструмент на панель инструментов matplotlib. Инструмент должен работать аналогично инструменту масштабирования: пользователь выбирает инструмент, рисует прямоугольник, и я получаю ограничивающую рамку в Python, так что я могу сохранить ее, а также нарисовать для пользователя. Однако в настоящее время я не могу добавить НИ ОДИН новый инструмент на панель инструментов.
Мой код сейчас выглядит так:

Код: Выделить всё

import sys

import matplotlib
import numpy as np

matplotlib.use("Qt5Agg")
import matplotlib.pyplot as plt
from matplotlib.backend_tools import ToolBase
from matplotlib.backends.backend_qtagg import FigureCanvas
from matplotlib.backends.backend_qtagg import \
NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (QAction, QApplication, QMainWindow, QVBoxLayout,
QWidget)

plt.rcParams['toolbar'] = 'toolmanager'

class ListTools(ToolBase):
"""List all the tools controlled by the `ToolManager`."""
# keyboard shortcut
default_keymap = 'm'
description = 'List Tools'

def trigger(self, *args, **kwargs):
print('_' * 80)
print("{0:12} {1:45} {2}".format('Name (id)', 'Tool description',
'Keymap'))
print('-' * 80)
tools = self.toolmanager.tools
for name in sorted(tools):
if not tools[name].description:
continue
keys = ', '.join(sorted(self.toolmanager.get_tool_keymap(name)))
print("{0:12} {1:45} {2}".format(name, tools[name].description,
keys))
print('_' * 80)
print("Active Toggle tools")
print("{0:12} {1:45}".format("Group", "Active"))
print('-' * 80)
for group, active in self.toolmanager.active_toggle.items():
print("{0:12} {1:45}".format(str(group), str(active)))

class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)

self.sc = FigureCanvas(Figure(figsize=(5, 3), tight_layout=True))
self.sc.manager.toolmanager.add_tool('List', ListTools)
self.toolbar = NavigationToolbar(self.sc, self)
self.addToolBar(self.toolbar)
print(dir(self.toolbar))

uniform_data = np.random.rand(10, 12)

axes = self.sc.figure.subplots()

axes.imshow(uniform_data)

widget = QWidget()
self.setCentralWidget(widget)
layout = QVBoxLayout(widget)
layout.addWidget(self.sc)

def main():
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()

if __name__ == "__main__":
main()
Однако на строке 51 происходит сбой:

Код: Выделить всё

self.sc.manager.toolmanager.add_tool('List', ListTools)
AttributeError: у объекта «NoneType» нет атрибута «менеджер инструментов»
Я не смог найти никакой дополнительной информации в руководстве по Matplotlib. Я также не смог найти никаких решений этой проблемы на Stackoverflow, единственный вопрос, который я нашел, был вот этот, однако ответов нет. Более того, я нашел только одну проблему на GitHub по этому поводу, в которой также не описывается, как решить эту проблему. Может кто-нибудь объяснить мне, что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/728 ... he-toolbar

Вернуться в «Python»