Сложная реализация класса с помощью полотен PyQt и Matplotlib - PullRequest
0 голосов
/ 15 мая 2018

У меня есть приложение с несколькими окнами, где у каждого окна есть свой холст Matplotlib. Я установил PlotCanvas для чертежа и WidgetPlot оболочку, которая определяет макет графического интерфейса и позволяет подключиться к бэкэнду, например, для. ярлыки.

В любом случае, я бы хотел, чтобы каждое окно создавало свой холст с помощью

self.m = WidgetPlot(ax_layout = "triple") # <- How do I make sure this argument reaches PlotCanvas?
self.canvas = self.m.canvas
self.mpl_LayoutBox.addWidget(self.m)

Но, как я указал в комментарии, я слишком глуп в ООП, чтобы понять, как пройти, например. «ax_layout» в качестве аргумента для создания экземпляров различных типов макетов.

Минимальный пример ниже, где я пытался установить ax_layout. Рабочий пример получается, если вы удалите ax_layout аргументы и вместо этого установите self.ax_layout = "single" непосредственно в классе PlotCanvas.

from PyQt5.Qt import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class WidgetPlot(QWidget):
    def __init__(self, ax_layout, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.setLayout(QVBoxLayout())
        self.canvas = PlotCanvas(self, ax_layout)
        self.layout().addWidget(self.canvas)

class PlotCanvas(FigureCanvas):
    def __init__(self, ax_layout, parent = None, width = 1, height = 1, dpi = 100):
        self.fig = Figure(figsize = (width, height), dpi = dpi, tight_layout = True)
        self.ax_layout = ax_layout

        if self.ax_layout == "triple":
            self.ax1 = self.fig.add_subplot(131)
            self.ax2 = self.fig.add_subplot(132)
            self.ax3 = self.fig.add_subplot(133)

            self.ax1.plot(range(100), color = "green")
            self.ax2.plot(range(100), color = "red")
            self.ax3.plot(range(100), color = "blue")

        elif self.ax_layout == "single":
            self.ax = self.fig.add_subplot(111)
            self.ax.plot(range(100), color = "black")
        else:
            raise ValueError

        FigureCanvas.__init__(self, self.fig)

class Ui_TraceWindow(object):
    def setupUi(self, TraceWindow):
        TraceWindow.setObjectName("TraceWindow")
        TraceWindow.resize(1086, 500)
        TraceWindow.setMinimumSize(QSize(900, 500))
        TraceWindow.setMaximumSize(QSize(5000, 2000))
        self.centralWidget = QWidget(TraceWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.gridLayout_2 = QGridLayout(self.centralWidget)
        self.gridLayout_2.setContentsMargins(11, 11, 11, 11)
        self.gridLayout_2.setSpacing(6)
        self.gridLayout = QGridLayout()
        self.gridLayout.setSpacing(6)
        self.mpl_LayoutBox = QVBoxLayout()
        self.mpl_LayoutBox.setSpacing(6)
        self.gridLayout.addLayout(self.mpl_LayoutBox, 3, 1, 1, 1)
        self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 1)
        TraceWindow.setCentralWidget(self.centralWidget)


        # Instantiate canvas here
        self.m = WidgetPlot(ax_layout = "triple") # <- How do I make sure this argument reaches PlotCanvas?
        self.canvas = self.m.canvas
        self.mpl_LayoutBox.addWidget(self.m)


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    TraceWindow = QMainWindow()
    ui = Ui_TraceWindow()
    ui.setupUi(TraceWindow)
    TraceWindow.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 15 мая 2018

Дополнительный параметр должен быть справа от других параметров, также рекомендуется иметь значение по умолчанию:

from PyQt5.Qt import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class WidgetPlot(QWidget):
    def __init__(self, parent=None, ax_layout=""):
        QWidget.__init__(self, parent)
        self.setLayout(QVBoxLayout())
        self.canvas = PlotCanvas(self, ax_layout=ax_layout)
        self.layout().addWidget(self.canvas)

class PlotCanvas(FigureCanvas):
    def __init__(self, parent = None, width = 1, height = 1, dpi = 100, ax_layout=""):
        self.fig = Figure(figsize = (width, height), dpi = dpi, tight_layout = True)
        self.ax_layout = ax_layout

        if self.ax_layout == "triple":
            self.ax1 = self.fig.add_subplot(131)
            self.ax2 = self.fig.add_subplot(132)
            self.ax3 = self.fig.add_subplot(133)

            self.ax1.plot(range(100), color = "green")
            self.ax2.plot(range(100), color = "red")
            self.ax3.plot(range(100), color = "blue")

        elif self.ax_layout == "single":
            self.ax = self.fig.add_subplot(111)
            self.ax.plot(range(100), color = "black")
        else:
            raise ValueError

        FigureCanvas.__init__(self, self.fig)

class Ui_TraceWindow(object):
    def setupUi(self, TraceWindow):
        TraceWindow.setObjectName("TraceWindow")
        TraceWindow.resize(1086, 500)
        TraceWindow.setMinimumSize(QSize(900, 500))
        TraceWindow.setMaximumSize(QSize(5000, 2000))
        self.centralWidget = QWidget(TraceWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.gridLayout_2 = QGridLayout(self.centralWidget)
        self.gridLayout_2.setContentsMargins(11, 11, 11, 11)
        self.gridLayout_2.setSpacing(6)
        self.gridLayout = QGridLayout()
        self.gridLayout.setSpacing(6)
        self.mpl_LayoutBox = QVBoxLayout()
        self.mpl_LayoutBox.setSpacing(6)
        self.gridLayout.addLayout(self.mpl_LayoutBox, 3, 1, 1, 1)
        self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 1)
        TraceWindow.setCentralWidget(self.centralWidget)


        # Instantiate canvas here
        self.m = WidgetPlot(ax_layout = "triple") # <- How do I make sure this argument reaches PlotCanvas?
        self.canvas = self.m.canvas
        self.mpl_LayoutBox.addWidget(self.m)


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    TraceWindow = QMainWindow()
    ui = Ui_TraceWindow()
    ui.setupUi(TraceWindow)
    TraceWindow.show()
    sys.exit(app.exec_())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...