2014-04-27 36 views
1

我想添加一个UDP接收器:我可以在UDP接收器上使用Twisted GTK Reactor吗?

from twisted.internet.protocol import DatagramProtocol 
from twisted.internet import reactor 

class UDP(DatagramProtocol): 

    def datagramReceived(self, data, (host, port)): 
    #Receive a string "X Y" and add to plot.  
    print "Received %r from %s:%d" % (data, host, port) 

reactor.listenUDP(9999, UDP()) 
reactor.run() 

到使用GTKReactor我现有的matplotlib代码:

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 onclick(event): 
    print 'Clicked: %d, X=%d, Y=%d, Xdata=%f, Ydata=%f' % (event.button, event.x, event.y, event.xdata, event.ydata) 

def onpress(event): 
    print "Pressed: ", event.key 


def main(): 
    fig = pyplot.figure() 
    pyplot.plot([1,2,3,4]) 
    pyplot.ylabel('Numbers') 

    cid = fig.canvas.mpl_connect('button_press_event', onclick) 
    cid = fig.canvas.mpl_connect('key_press_event', onpress) 

    def proof(): 
     print 'Twisted!' 
    task.LoopingCall(proof).start(3) 

    TwistedGtkShow()() 

if __name__ == '__main__': 
    main() 

但他们都没有阻止?我怎样才能运行它们并更新图表以及响应点击事件并潜在地发回UDP数据包?

回答

1

添加它。

所有你必须要小心做的是不叫reactor.run()两次。 reactor.run()是Twisted中的阻塞API(它将阻塞,直到程序结束)。