PyQt5 Matplotlib датаплот с сигналом и слот со списками - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть 3 класса, mainwindow class, plot class и Listxy class.Я хочу соединить списки X и Y в class Listxy с class Plot для рисования данных.Я хочу соединить их в mainwindow class и class plot будет обновляться в соответствии с X и Y lists.то есть x = [x for x in X] и y = [y for y in Y].Я не совсем уверен, что слот и сигнал будут работать со списками.Мне нужна помощь в этом.

Визуализация:

enter image description here

Код:

import sys
from PyQt5 import QtCore, QtWidgets, QtGui
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

class Mainwindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(Mainwindow, self).__init__()

        self.setMinimumSize(QtCore.QSize(1200,800))
        self.setWindowTitle('My Graphic Window')

        self.list_x_y = Listxy()
        self.plotview = Plot()
        self.setCentralWidget(self.plotview)


class Plot(QtWidgets.QWidget):
    def __init__(self):
        super(Plot, self).__init__()
        self.initializewidget()
        self.plot1()

    def initializewidget(self):
        self.setWindowTitle("Plotting M&N")
        gridlayout = QtWidgets.QGridLayout()
        self.setLayout(gridlayout)

        self.figure = plt.figure(figsize=(15,5))
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas,self)
        gridlayout.addWidget(self.canvas,1,0,1,2)
        gridlayout.addWidget(self.toolbar,0,0,1,2)


    def plot1(self):
        ax = self.figure.add_subplot(111)
        x = [i for i in range(100)]
        y = [i**2 for i in x]
#        x = [0]
#        y = [0]
        ax.plot(x,y, 'y.-')
        ax.set_title('Quadratic Plot')
        self.canvas.draw()


class Listxy:

    X = []
    Y = []

    def createdata(self):
        for x in range(0,100):
            X.append(x)
        for y in range(0,100):
            Y.append(y) 

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    im = Mainwindow()
    im.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 05 декабря 2018

Сигналы и слоты поддерживают все типы данных Python, поэтому можно использовать списки.Также имейте в виду, что только классы, которые наследуются от QObject, могут иметь сигналы.В следующем примере показаны случайные данные, обновляющие график каждые 100 мс.

import sys
import random
from PyQt5 import QtCore, QtWidgets, QtGui
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

class Mainwindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(Mainwindow, self).__init__()

        self.setMinimumSize(QtCore.QSize(1200,800))
        self.setWindowTitle('My Graphic Window')

        self.list_x_y = ListXY()
        self.plotview = Plot()
        self.setCentralWidget(self.plotview)
        self.list_x_y.listChanged.connect(self.plotview.update_data)

        timer = QtCore.QTimer(self, interval=100)
        timer.timeout.connect(self.list_x_y.createdata)
        timer.start()

class Plot(QtWidgets.QWidget):
    def __init__(self):
        super(Plot, self).__init__()
        self.initializewidget()

    def initializewidget(self):
        self.setWindowTitle("Plotting M&N")
        gridlayout = QtWidgets.QGridLayout()
        self.setLayout(gridlayout)

        self.figure = plt.figure(figsize=(15,5))
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas,self)
        gridlayout.addWidget(self.canvas,1,0,1,2)
        gridlayout.addWidget(self.toolbar,0,0,1,2)

        self._ax = self.figure.add_subplot(111)
        self._ax.set_title('Random Plot')
        self._line = self._ax.plot([], [], 'y.-')[0]

    @QtCore.pyqtSlot(list, list)
    def update_data(self, x, y):
        self._line.set_data(x, y)
        self._ax.set_xlim(min(x), max(x))
        self._ax.set_ylim(min(y), max(y))
        self.canvas.draw()

class ListXY(QtCore.QObject):
    listChanged = QtCore.pyqtSignal(list, list)

    def createdata(self):
        X, Y = list(range(100)), []
        for y in range(0,100):
            Y.append(random.randint(0, 100)) 
        self.listChanged.emit(X, Y)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    im = Mainwindow()
    im.show()
    sys.exit(app.exec_())

enter image description here

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