2012-04-30 42 views
2

我有一个可视化的Python网络流量。它使用Twisted进行网络连接并调用run()它还具有用于绘图和调用show()的matplotlib。这些功能似乎都不会返回,但我需要调用它们来启动网络,然后显示情节并最终更新网络上发生的情节。任何解决方案我需要线程吗?如何运行两个python阻塞函数matplotlib.show()和twisted.reactor.run()?

+0

您可以使用线程,或者可以将扭曲的主循环更新挂钩为matplotlib事件,或将matplotlib更新挂钩为扭曲的事件。 –

回答

3

matplotlib是一个GUI工具包的顶层。哪个GUI工具包取决于每个用户的配置,在站点范围内的配置,以及您所拥有的matplotlib代码的详细信息。

Twisted具有与某些GUI工具包集成的特定支持。因此,例如,您可以运行带有Gtk后端的matplotlib,并使用Twisted的Gtk集成,然后一切都将很好地结合在一起。

这里有5分钟砍我扔在一起,根据我所知道的关于整合各种mainloops,并在matplotlib源代码检查的一点点:

if __name__ == '__main__': 
    from mpl import main 
    raise SystemExit(main()) 

from matplotlib import use 
use('GTK') 
from matplotlib import pyplot 

from matplotlib.backends import backend_gtk 

from twisted.internet import gtk2reactor 
gtk2reactor.install() 

from twisted.internet import reactor, task 

class TwistedGtkShow(backend_gtk.Show): 
    running = False 
    def mainloop(self): 
     if not self.running: 
      self.running = True 
      reactor.run() 

def main(): 
    pyplot.plot([1,2,3,4]) 
    pyplot.ylabel('some numbers') 

    def proof(): 
     print 'Twisted!' 
    task.LoopingCall(proof).start(3) 

    TwistedGtkShow()() 

注意:

  • 这是一个名为mpl.py文件(因此mpl进口往上顶)
  • 我被迫matplotlib使用GTK与use('GTK')呼叫进口前
  • 我被迫扭曲使用GTK与gtk2reactor.install()呼叫进口reactor
  • 之前,我更换了呼叫pyplot.show()与我自己Show子类调用使用mainloop方法启动GTK的主循环的扭曲主循环(两通过reactor.run()

这个例子似乎工作得很好。我还没有深入探讨这个问题,所以如果有问题只会在更高级的用法下出现,我不知道它们。