wxPython多线程matplotlib绘图不在主线程中

4 投票
1 回答
611 浏览
提问于 2025-04-17 14:03

我想做的事情:

  1. 在一个线程中运行TCP服务器
  2. 从套接字接收数据
  3. 更新图表并显示数据

我成功做了以下事情:

  1. 用wxPython创建了一个窗口,里面有一个按钮,
  2. 点击按钮就可以启动套接字
  3. 从套接字接收数据

问题是:

  1. 当我尝试从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 "
    

代码:

  1. 主程序,启动线程的地方

    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()
    
  2. 线程,尝试绘图的地方:

    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

谢谢你,不过我已经解决了这个问题,现在可以从不同的线程运行计时器了。

这是语言本身的限制,不过通过一些变通的方法,问题也解决了。

撰写回答