discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss-gnuradio] matplotlib runtime error


From: Activecat
Subject: [Discuss-gnuradio] matplotlib runtime error
Date: Fri, 2 May 2014 20:17:13 +0800

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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]