Python - 没有阻塞的Matplotlib响应窗口

时间:2013-11-22 15:05:44

标签: python-2.7 matplotlib

我有一个主线程,可以实时收集数据。当它收到一些数据时,它会将数据添加到堆栈中。然后,堆栈由另一个将数据写入磁盘的线程处理。

现在我也想让这个线程绘制一些数据(每分钟左右)。我真的很喜欢Matplotlibs 3D散点图(你可以用鼠标旋转和缩放等)。问题是,窗口是阻塞的,所以我的程序不会继续,或者,如果我使它无阻塞,窗口控件没有响应(没有鼠标旋转等)。有没有办法可以兼顾两者?我尝试在另一个线程中做Matplotlib的东西,但后来它抱怨它需要在主线程中(尝试使用默认的QT4和TkAgg后端)。

文件:plotter.py

import numpy as np 
from pylab import *
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import threading

class plotter:
    def showThread(self):
        plt.show()

    def __init__(self):
        print "plotter initializing"
    #    plt.ion() 
        fig = plt.figure()
        ax1 = Axes3D(fig)
        self.ax1 = ax1
        ax1.scatter([0],[0],[0])        
        ax1.set_xlim3d(0,512,30)
        ax1.set_ylim3d(0,256,30)
        ax1.set_zlim3d(0,20,5)
        plt.draw()
        t = threading.Thread(target=self.showThread)
        t.start()

    def plot(self,xlist,ylist,zlist):
        #This function updates the plot..
        self.ax1.scatter(xlist,ylist,zlist)        
        self.ax1.set_xlim3d(0,512,30)
        self.ax1.set_ylim3d(0,256,30)
        self.ax1.set_zlim3d(0,20,5) 
        plt.draw()

错误TkInter:

TclError: out of stack space (infinite loop?)

错误QT4(提供更多错误):

File "/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_qt4.py", line 73, in mainloop
signal.signal(signal.SIGINT, signal.SIG_DFL)
ValueError: signal only works in main thread

0 个答案:

没有答案