【问题标题】:PyQt5 Matplotlib dataplot with signal and slot with listsPyQt5 Matplotlib 数据图与信号和槽与列表
【发布时间】:2019-05-06 21:49:52
【问题描述】:

我有 3 个班级,mainwindow classplot classListxy class。我想将class Listxy 中的XY 列表连接到class Plot 以绘制数据。我想将它们连接到mainwindow classclass plot 将根据XY lists 进行更新。即x = [x for x in X]y = [y for y in Y]。我不太确定,该插槽和信号是否适用于列表。我需要帮助。

可视化:

代码:

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_())

【问题讨论】:

    标签: python python-3.x matplotlib pyqt pyqt5


    【解决方案1】:

    信号和槽支持所有类型的 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_())
    

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2016-07-17
      • 1970-01-01
      • 2013-10-08
      • 2016-10-21
      相关资源
      最近更新 更多