I like to use wxPython for real time things. Here is an example application that does what you ask. It retrieves generated readings and plots in a window.
(Since I can't see your data, I generate a sine wave in a separate thread and plot it)
import wx from Queue import Queue, Empty, Full import threading from time import sleep from math import sin from itertools import count class Producer(threading.Thread): def __init__(self,queue): self.queue=queue self.t=0 threading.Thread.__init__(self) self.daemon=False def run(self): print "initializing producer" freq=0.1 secondsBetweenReadings=1.0/32 try: while True: readings=[ 256.0*sin(freq*t) for t in range(self.t,self.t+4) ] self.t = self.t+4 self.queue.put(readings,timeout=0.1) sleep(secondsBetweenReadings) except Full: print "Queue Full. Exiting" class App(wx.App): def __init__(self,queue): self.queue=queue wx.App.__init__(self,redirect=False) def OnInit(self): self.frame=wx.Frame(parent=None,size=(256,256)) self.plotPanel=wx.Panel(self.frame,size=(256,256)) self.plotPanel.SetBackgroundColour(wx.BLACK) self.data=[] self.plotPanel.Bind(wx.EVT_PAINT,self.OnPaintPlot) self.plotPanel.Bind(wx.EVT_ERASE_BACKGROUND,lambda evt: None) #For Windows self.Bind(wx.EVT_IDLE,self.CheckForData) self.frame.Show() return True def CheckForData(self,evt): try: data=self.queue.get(timeout=0.05) self.data.extend(data) self.plotPanel.Refresh() except Empty: pass evt.RequestMore() def OnPaintPlot(self,evt): w,h=self.plotPanel.GetClientSize() dc=wx.PaintDC(self.plotPanel) dc.SetBrush(wx.BLACK_BRUSH) dc.DrawRectangle(0,0,w,h) dc.SetPen(wx.WHITE_PEN) coords=zip(count(),self.data) if len(coords) > 2: dc.DrawLines(coords) if __name__ == "__main__": maxReadings=32 queue=Queue(maxReadings) producer=Producer(queue) plotterApp=App(queue) producer.start() plotterApp.MainLoop()