Как встроить сюжет Matplotlib в виджет PyQT? - PullRequest
0 голосов
/ 21 марта 2020

Я хочу встроить график Matplotlib в мое приложение PyQt с помощью QWidget. Это код скрипта виджета.

from PyQt5.QtWidgets import*
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure
from entropia import entropy
import matplotlib.pyplot as plt
import numpy as np
import random

class MplWidget(QWidget):

    def __init__(self, parent = None):
        QWidget.__init__(self,parent)

        self.canvas = FigureCanvas(Figure())

        self.vertical_layout = QVBoxLayout()
        self.vertical_layout.addWidget(self.canvas)

        self.setLayout(self.vertical_layout)

    def draw(self):

        QWidget.update(self)

        self.canvas.axes = self.canvas.figure.add_subplot(111)

        fs = 500
        f = random.randint(1, 100)
        ts = 1/fs
        length_of_signal = 100
        t = np.linspace(0,1,length_of_signal)

        cosinus_signal = np.cos(2*np.pi*f*t)
        sinus_signal = np.sin(2*np.pi*f*t)

        self.canvas.axes.clear()
        self.canvas.axes.plot(t, cosinus_signal)
        self.canvas.axes.plot(t, sinus_signal)
        self.canvas.axes.legend(('cosinus', 'sinus'),loc='upper right')
        self.canvas.axes.set_title('Cosinus - Sinus Signal')
        self.canvas.draw()

Я хочу, чтобы график отображался после нажатия кнопки в другом скрипте. К сожалению, это не работает. Кнопка подключена к функции, хотя. Если я делаю что-то вроде print (fs) в методе draw, я вижу переменную в терминале python при нажатии кнопки.

Вот как это выглядит при нажатии кнопки:

enter image description here

Когда я перемещаю все это в init метод отображения графика.

class MplWidget(QWidget):

    def __init__(self, parent = None):
        QWidget.__init__(self,parent)

        self.canvas = FigureCanvas(Figure())

        self.vertical_layout = QVBoxLayout()
        self.vertical_layout.addWidget(self.canvas)

        self.canvas.axes = self.canvas.figure.add_subplot(111)
        self.setLayout(self.vertical_layout)

        fs = 500
        f = random.randint(1, 100)
        ts = 1/fs
        length_of_signal = 100
        t = np.linspace(0,1,length_of_signal)

        cosinus_signal = np.cos(2*np.pi*f*t)
        sinus_signal = np.sin(2*np.pi*f*t)

        self.canvas.axes.clear()
        self.canvas.axes.plot(t, cosinus_signal)
        self.canvas.axes.plot(t, sinus_signal)
        self.canvas.axes.legend(('cosinus', 'sinus'),loc='upper right')
        self.canvas.axes.set_title('Cosinus - Sinus Signal')
        self.canvas.draw()

enter image description here

Итак, что я могу сделать, чтобы отобразить график только после вызова его из другого метода

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