2

Pythonのネットワークトラフィック用のビジュアライザーがあります。ネットワーキングにTwistedを使用しrun()、プロットと呼び出しにmatplotlibを呼び出しますshow()。これらの関数はどちらも戻ってこないようですが、ネットワークを開始するために両方を呼び出してから、プロットを表示し、ネットワーク上で発生したときに最終的にプロットを更新する必要があります。解決策はありますか?スレッドが必要ですか?

4

1 に答える 1

3

matplotlib は、いくつかの GUI ツールキットの上にあるレイヤーです。GUIツールキットは、ユーザーごとの構成、サイト全体の構成、持っているmatplotlibコードの詳細に少し依存します。

Twisted は、いくつかの GUI ツールキットとの統合をサポートしています。したがって、たとえば、Gtk バックエンドで matplotlib を実行し、Twisted の Gtk 統合を使用すると、すべてがうまく連携します。

これは、さまざまなメインループの統合について知っていることと、matplotlib ソース コードの少しの検査に基づいて、私が一緒に投げた 5 分間のハックです。

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インポートが一番上にあります)
  • use('GTK')インポートする前に、呼び出しで matplotlib に Gtk を使用するように強制しましたpyplot
  • gtk2reactor.install()インポートする前に、呼び出しで Twisted に Gtk を使用するように強制しましたreactor
  • pyplot.show()への呼び出しを自分のShowサブクラスへの呼び出しに置き換え、mainloopメソッドで Gtk メインループTwisted メインループを開始します (両方とも 経由reactor.run())

この例はかなりうまくいくようです。私はこれをあまり調べていないので、より高度な使用法でのみ発生する問題がある場合、私はそれらについて知りません.

于 2012-05-01T12:33:28.107 に答える