2
我有一个可视化的Python网络流量。它使用Twisted进行网络连接并调用run()
它还具有用于绘图和调用show()
的matplotlib。这些功能似乎都不会返回,但我需要调用它们来启动网络,然后显示情节并最终更新网络上发生的情节。任何解决方案我需要线程吗?如何运行两个python阻塞函数matplotlib.show()和twisted.reactor.run()?
我有一个可视化的Python网络流量。它使用Twisted进行网络连接并调用run()
它还具有用于绘图和调用show()
的matplotlib。这些功能似乎都不会返回,但我需要调用它们来启动网络,然后显示情节并最终更新网络上发生的情节。任何解决方案我需要线程吗?如何运行两个python阻塞函数matplotlib.show()和twisted.reactor.run()?
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
进口往上顶)use('GTK')
呼叫进口前gtk2reactor.install()
呼叫进口reactor
pyplot.show()
与我自己Show
子类调用使用mainloop
方法启动GTK的主循环和的扭曲主循环(两通过reactor.run()
)这个例子似乎工作得很好。我还没有深入探讨这个问题,所以如果有问题只会在更高级的用法下出现,我不知道它们。
您可以使用线程,或者可以将扭曲的主循环更新挂钩为matplotlib事件,或将matplotlib更新挂钩为扭曲的事件。 –