[英]PyQt5 Matplotlib dataplot with signal and slot with lists
我有3個類, mainwindow class
, plot class
和Listxy class
。 我想將class Listxy
class Plot
X
和Y
列表連接到class Plot
,以便繪制數據。 我想將它們連接到mainwindow class
並且class plot
將根據X
和Y 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數據,因此可以使用列表。 還請記住,只有從QObject繼承的類才可以具有信號。 以下示例顯示了隨機數據每100 ms更新一次繪圖的情況。
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_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.