wxPython多线程matplotlib绘图不在主线程中
我想做的事情:
- 在一个线程中运行TCP服务器
- 从套接字接收数据
- 更新图表并显示数据
我成功做了以下事情:
- 用wxPython创建了一个窗口,里面有一个按钮,
- 点击按钮就可以启动套接字
- 从套接字接收数据
问题是:
当我尝试从TCP服务器线程调用绘图函数时,出现了这个错误
"PyAssertionError: C++ assertion "wxThread::IsMain()" failed at ..\..\src\common\timercmn.cpp(66) in wxTimerBase::Start(): timer can only be started from the main thread "
代码:
主程序,启动线程的地方
def start_socket(self): HOST = '' PORT_A = 6340 self.server_A = ThreadedTCPServer((HOST, PORT_A), ThreadedTCPRequestHandler) self.server_temp = self.server_A self.server_A_thread = threading.Thread(target=self.server_A.serve_forever) self.server_A_thread.setDaemon(True) self.server_A_thread.start()
线程,尝试绘图的地方:
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): def handle(self): self.Main = Main(None, -1, '') self.data = self.request.recv(1024).strip() print "%s wrote: " % self.client_address[0] print self.data plt.ion() self.fig = plt.figure(1) print self.image_scale ax = self.fig.add_subplot(111) self.image_scale = ([1,2], [ 4,10 ] ) cax = plt.imshow(self.image_scale, cmap='Greys', interpolation='nearest' ) draw()
通过调试发现,错误出现在这一行:
self.fig = plt.figure(1)
Error: "timer can only be started from the main thread"
所以,我不太确定,但我觉得我需要在wx.Frame的主函数中进行绘图。有没有什么解决方案可以让程序正常运行,同时在另一个线程中实时绘图?特别是我打算创建多个TCP服务器线程。
提前感谢你的帮助,非常感激。
1 个回答
-3
谢谢你,不过我已经解决了这个问题,现在可以从不同的线程运行计时器了。
这是语言本身的限制,不过通过一些变通的方法,问题也解决了。