我正在開發一個項目,在該項目上我必須在GUI的窗口上繪製320 * 250像素的圖像,並且如果可能的話,每秒顯示60次。所以,我嘗試用matplotlib 2.0.2,Python來做到這一點3.6和PyQt5(因爲我開始知道這些工具和與此另一個項目工作),以下列方式:Matplotlib,使用imshow更快地刷新圖像
import sys, random, matplotlib
from PyQt5 import QtCore, QtGui, QtWidgets
matplotlib.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
class SecondWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super(SecondWindow, self).__init__(parent)
self.setupUi(self)
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(800, 600)
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.axes = self.figure.add_subplot(111)
self.setLayout(QtWidgets.QVBoxLayout())
self.layout().addWidget(self.canvas)
self.initialisationFigure()
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.majFigure)
self.timer.start(16)
self.timer2 = QtCore.QTimer(self)
self.timer2.timeout.connect(self.NumberRefreshPerSecond)
self.timer2.start(1000)
def NumberRefreshPerSecond(self):
print(self.count)
self.count = 0
def majFigure(self):
self.count = self.count + 1
self.plot.set_data([[random.random() for x in range(1, 320)] for y in range(1, 250)])
# self.canvas.draw()
self.axes.draw_artist(self.axes.patch)
self.axes.draw_artist(self.plot)
self.canvas.update()
self.canvas.flush_events()
def initialisationFigure(self):
self.plot = self.axes.imshow([[random.random() for x in range(1,320)] for y in range(1,250)], interpolation='none')
self.count = 0
self.canvas.draw()
def closeEvent(self, event):
self.timer.stop()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = SecondWindow()
form.show()
sys.exit(app.exec_())
我進行了優化,就像我可以關閉插值一樣,只繪製一次圖形,但使用此代碼,程序每秒僅刷新數字20次,而計時器正確設置爲16ms(1/60Hz)。
我希望有人能幫我給我一些提高我的代碼的線索。 我非常感謝你!
你吃過看看[matplotlib的'animation'模塊(https://matplotlib.org/api/ animation_api.html)? – Paul
還沒有,我現在回來給你我的新fps。 –
僅供參考,使用'numpy.random.random((250,320))'代替循環創建圖像,在我的機器上提供了10-15fps的提升 – user3419537