Gurus, I try to transfer an image file via a pair of USRPs. At the receiver side, the data is fed into a custom block, where it plots the image in realtime using matplotlib's pyplot.imshow(). Unfortunately, in the work() function, the pyplot.draw() causes below runtime error.
handler caught exception: main thread is not in main loop Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/gnuradio/gr/gateway.py", line 55, in eval try: self._callback() File "/usr/local/lib/python2.7/dist-packages/gnuradio/gr/gateway.py", line 160, in __gr_block_handle ) for i in self.__out_indexes], File "/usr/local/lib/python2.7/dist-packages/activecat/image_sink1.py", line 72, in work self.axes1.figure.canvas.draw() #pyplot.draw() File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 349, in draw tkagg.blit(self._tkphoto, self.renderer._renderer, colormode=2) File "/usr/lib/pymodules/python2.7/matplotlib/backends/tkagg.py", line 13, in blit tk.call("PyAggImagePhoto", photoimage, id(aggimage), colormode, id(bbox_array)) RuntimeError: main thread is not in main loop thread[thread-per-block[1]: <block image_sink1 (2)>]: caught unrecognized exception The custom block (perform plotting) is written in Python, as below: #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy from gnuradio import gr from matplotlib import image, pyplot class image_sink1(gr.sync_block): def __init__(self): gr.sync_block.__init__( self, name="image_sink1", in_sig=[ numpy.complex64 ], out_sig=None) pyplot.figure() pyplot.ion() pyplot.show() self.axes1 = pyplot.gca() #self.win = self.axes1.figure.canvas.manager.window #self.win.after(100,animate) self.completed = False self.img2 = numpy.zeros( (150,150,4), numpy.uint8 ) self.coordinate = self.coordinate_stream() def coordinate_stream(self): for y in range(150): for x in range( 0, 150, 2 ): yield y,x def work(self, input_items, output_items): in0 = input_items[0] if self.completed: return -1 for sample1 in in0: try: y,x = next( self.coordinate ) if sample1.real > 0: self.img2[y,x] = numpy.array([255,255,255,255]) else: self.img2[y,x] = numpy.array([0,0,0,255]) if sample1.imag > 0: self.img2[y,x+1] = numpy.array([255,255,255,255]) else: self.img2[y,x+1] = numpy.array([0,0,0,255]) except StopIteration: print "Receiver side completed!" self.complete = True self.axes1.imshow( self.img2 ) self.axes1.figure.canvas.draw() # or, pyplot.draw(), both gives error !!! return in0.size Please advise, thanks in advance.
_______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnuradio