在带有PYQT5的嵌入式Matplotlib GUI应用程序中使用交互式模式



我在python 3.5,pyqt5和matplotlib 1.5.3中编写了一个程序,我在其中使用了pyplot互动模式。这里是一个最小示例:

import numpy as np
import matplotlib.pyplot as plt
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid(True)
for i in range (0, 10):
    plt.scatter(i, np.sin(i))
    fig.canvas.draw()
plt.ioff()
plt.show()

因为现在我正在编写GUI,而我无法使用Pyplot,因为它自己的Eventloop会干扰QT,所以我正在重写代码的那部分,但是我没有找到相当于交互式模式带有PYQT5的Matplotlib小部件。这是基本示例:

import sys
import time
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import numpy as np
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget
if __name__ == '__main__':
    fig = Figure()
    canvas = FigureCanvas(fig)
    ax = fig.add_subplot(111)
    ax.grid(True)
    for i in range (0, 10):
        ax.scatter(i, np.sin(i))
        fig.canvas.draw()
    ui = QWidget()
    toolbar = NavigationToolbar(canvas, ui, coordinates=True)
    vbox = QVBoxLayout()
    vbox.addWidget(canvas)
    vbox.addWidget(toolbar)
    ui.setLayout(vbox)
    ui.show()
    app = QApplication(sys.argv)
    sys.exit(app.exec_())

我希望作为第一个示例,在每次迭代中都会更新绘图。如何修改代码?

谢谢!ciccio

这个问题正在显示如何在matplotlib和pyqt中进行交互式动画。因此,为了查看如何完成,请简单地参考此或任何其他相关问题。

代码的第一个问题是,它甚至在屏幕上显示窗口之前执行绘图循环。通常,在Guis中,总是最好是首先初始化窗口,然后启动应该发生的任何事情。

第二个问题目前隐藏在第一个问题之后,就是您在Guis主环内执行绘图环,以便在更长的循环时段,GUI会冻结。

最新更新