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