Python 如何在不使用或阻止主线程的情况下绘制多个实时绘图?

Python 如何在不使用或阻止主线程的情况下绘制多个实时绘图?,python,matplotlib,multiprocessing,real-time,pyqtgraph,Python,Matplotlib,Multiprocessing,Real Time,Pyqtgraph,如何使用主线程中运行的程序中的数据绘制实时更新的两个绘图 ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1)) ui.canvas = FigureCanvas(ui.figure) scene.addWidget(ui.canvas) 我尝试在PyQTGraph中使用QApplication类,但QApplication.exec()函数会阻止主程序执行,也不能在线程上运行 ui.figure, ui.ax

如何使用主线程中运行的程序中的数据绘制实时更新的两个绘图

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
我尝试在PyQTGraph中使用QApplication类,但QApplication.exec()函数会阻止主程序执行,也不能在线程上运行

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
回答这三个问题可能会有所帮助:

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
1) 是否还有另一个python可视化库/API不需要使用主线程来绘制对象,但速度足以绘制实时绘图

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
2) 如何使用Python的多处理功能实现这一点?我刚刚学会了线程,所以多处理似乎令人望而生畏。在主程序和另一个处理更新图形的程序之间传递数据需要哪些代码行

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
3) 多进程是否足够快,可以从主进程更新一个进程中的实时绘图

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)

非常感谢您提前提供的任何帮助。

这是PyQt特有的,因为它是线程安全的
    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
. 所以试着用openvc模块启动另一个线程,用它进行第二次绘图

import threading
threading.Timer(2, self.some_opencvplotfunction).start() #start every 2 sec
    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
您可以在opencv函数中使用主应用程序中的任何pyqt功能,因为这会导致运行时错误

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
另一种方法是使用matplotlib并实例化一个或多个子地块! 然后将matplotlib对象绑定到PyQT GUI中,如下所示:

if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        app.setStyle(QStyleFactory.create("Windows"))
        Dialog = QtGui.QDialog()
        ui = MAIN()
        ui.setupUi(Dialog) 
    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
在你的主课上呢

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)

您可以向gui添加cpu能够处理的尽可能多的子站点…

这是特定于PyQt的,因为这是为了线程安全
    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
. 所以试着用openvc模块启动另一个线程,用它进行第二次绘图

import threading
threading.Timer(2, self.some_opencvplotfunction).start() #start every 2 sec
    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
您可以在opencv函数中使用主应用程序中的任何pyqt功能,因为这会导致运行时错误

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
另一种方法是使用matplotlib并实例化一个或多个子地块! 然后将matplotlib对象绑定到PyQT GUI中,如下所示:

if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        app.setStyle(QStyleFactory.create("Windows"))
        Dialog = QtGui.QDialog()
        ui = MAIN()
        ui.setupUi(Dialog) 
    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)
在你的主课上呢

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)

您可以向gui添加cpu能够处理的尽可能多的子站点…

多处理是您唯一的选择。是否足够快取决于(绘图数据的)数据速率、一次显示多少点、更新图形的频率以及电脑的速度。如果我没记错的话,pyqtgraph内置了多处理支持。我认为它已经在示例应用程序中的一个示例中演示过了。我应该详细说明,多处理是您唯一的选择,因为Python GIL确保一次只运行一个线程。所有基于Qt的图形库都必须在主线程中绘制。感谢您的回复。这证实了我的直觉,我必须使用多重处理。我计划使用套接字进行进程间通信,除非有更简单的方法。套接字(python原始套接字或pyzmq)可以工作。如果您不希望套接字通信减慢主进程,那么zmq发布/订阅套接字可能是一个不错的选择。或者,python多处理库有一个队列对象来完成这项工作。在同一个库中也可能有共享内存支持(尽管您的差异可能因平台而异),多处理是您唯一的选择。是否足够快取决于(绘图数据的)数据速率、一次显示多少点、更新图形的频率以及电脑的速度。如果我没记错的话,pyqtgraph内置了多处理支持。我认为它已经在示例应用程序中的一个示例中演示过了。我应该详细说明,多处理是您唯一的选择,因为Python GIL确保一次只运行一个线程。所有基于Qt的图形库都必须在主线程中绘制。感谢您的回复。这证实了我的直觉,我必须使用多重处理。我计划使用套接字进行进程间通信,除非有更简单的方法。套接字(python原始套接字或pyzmq)可以工作。如果您不希望套接字通信减慢主进程,那么zmq发布/订阅套接字可能是一个不错的选择。或者,python多处理库有一个队列对象来完成这项工作。在同一个库中也可能有共享内存支持(尽管您的差异可能因平台而异),这很有启发性。谢谢。@mago3421如果你觉得这很有用,为什么不投票或打分数作为好答案呢?太好了,我需要代表点我是个新手,所以我的更新不可见,但我投票了。这很有启发性。谢谢。@mago3421如果你觉得这很有用,为什么不投票或打分数作为好答案呢?太好了,我需要代表点我是个新手,所以我的更新不可见,但我投票了。
    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)