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