2012-04-30 71 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()

這個例子似乎工作得很好。我還沒有深入探討這個問題,所以如果有問題只會在更高級的用法下出現,我不知道它們。