Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5 Matplotlib带信号的数据图和带列表的插槽_Python_Python 3.x_Matplotlib_Pyqt_Pyqt5 - Fatal编程技术网

Python PyQt5 Matplotlib带信号的数据图和带列表的插槽

Python PyQt5 Matplotlib带信号的数据图和带列表的插槽,python,python-3.x,matplotlib,pyqt,pyqt5,Python,Python 3.x,Matplotlib,Pyqt,Pyqt5,我有三个类,mainwindowclass,plot class和Listxy class。我想将class list xy中的X和Y列表连接到class Plot,以便绘制数据。我想在main窗口类中连接它们,class plot将根据X和Y列表更新。i、 e.x=[x代表x中的x]和y=[y代表y中的y]。我不是很确定,这个插槽和信号是否可以与列表一起使用。我需要帮助 可视化: import sys from PyQt5 import QtCore, QtWidgets, QtGui imp

我有三个类,
mainwindowclass
plot class
Listxy class
。我想将
class list xy
中的
X
Y
列表连接到
class Plot
,以便绘制数据。我想在
main窗口类中连接它们,
class plot
将根据
X
Y列表更新。i、 e.
x=[x代表x中的x]
y=[y代表y中的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_())

代码:

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数据,因此可以使用列表。还要记住,只有从QObject继承的类才能有信号。以下示例显示了每100ms更新一次绘图的随机数据

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