我有一个主线程,可以实时收集数据。当它收到一些数据时,它会将数据添加到堆栈中。然后,堆栈由另一个将数据写入磁盘的线程处理。
现在我也想让这个线程绘制一些数据(每分钟左右)。我真的很喜欢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