2

我有一个 Python 网络流量的可视化工具。它使用 Twisted 进行联网并调用run()它也有 matplotlib 用于绘图和调用show()。这些函数似乎都没有返回,但我需要调用它们来启动网络,然后显示情节并最终随着网络上发生的事情更新情节。有什么解决办法吗?我需要线程吗?

4

1 回答 1

3

matplotlib 是一些 GUI 工具包之上的一层。哪个 GUI 工具包取决于每个用户的配置、站点范围的配置以及您拥有的 matplotlib 代码的详细信息。

Twisted 对与某些 GUI 工具包的集成具有特定的支持。因此,例如,您可以使用其 Gtk 后端运行 matplotlib 并使用 Twisted 的 Gtk 集成,然后一切都会很好地协同工作。

根据我对集成各种主循环的了解,以及对 matplotlib 源代码的一点检查,我整理了一个 5 分钟的 hack:

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 在调用中使用 Gtkpyplot
  • gtk2reactor.install()在导入之前,我强制 Twisted 在调用中使用 Gtkreactor
  • 我将调用替换为pyplot.show()对我自己的Show子类的调用,mainloop方法是启动 Gtk 主循环Twisted 主循环(均通过reactor.run()

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

于 2012-05-01T12:33:28.107 回答