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

时间:2013-01-29 14:28:51

标签: python matplotlib wxpython

我想做什么:

  1. 在线程中运行TCPServer
  2. 获取数据“从套接字接收”
  3. 更新图表并显示数据
  4. 我成功做了什么:

    1. 带有wxPython的框架有一个按钮,
    2. 点击按钮启动套接字
    3. 从套接字接收数据
    4. 问题:

      1. 当我尝试从TCPServer线程调用绘图函数时,我收到此错误

        "PyAssertionError: C++ assertion "wxThread::IsMain()" failed at ..\..\src\common\timercmn.cpp(66)
        in wxTimerBase::Start(): timer can only be started from the main thread "
        
      2. 守则:

        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()
          
        3. 通过调试,错误来自这一行:

          self.fig = plt.figure(1)
          
          Error:  "timer can only be started from the main thread"
          

          所以,不确定,但我认为我需要在wx.Frame的主要功能中进行绘图,是否有任何解决方案允许保持正常程序运行,并允许在另一个线程中实时绘图?特别是我打算制作一个以上的TCPServer线程。

          提前感谢您,我们将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

非常感谢,我解决了它,现在从不同的线程运行计时器,

它在语言方面的局限性,以及可行的解决方法