title: accessing threads continually in tkinter loop
body: <p>I am trying to make a GUI that continually plot a signal received from a micro processor. I have tried to make this happen by use of classes only, but that failed since only the GUI class was oppend. Now i have implemented threading (or at least I think I have!?) but each thread is only run once. which make me believe that I don't understand how the mainloop in tkinter works, so can I remake my code in away that the threads become active? </p>
  
  <pre><code>import Tkinter
  import tkMessageBox as messagebox
  from serial import *
  from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
  from matplotlib.figure import Figure
  import numpy as np
  import time
  import threading
  
  go=0
  
  x=[0.0001,0.0002,0.0003]
  y=[3600,1000,2000]
  stid=time.time()
  
  root = Tkinter.Tk()
  root.title("Serial gui")
  
  class SensorThread(threading.Thread):
      def run(self):
          global run
          global x
          global y
          global stid
          print "run er ok"
          if go==1:
              print "go er ok"
              ser = Serial(5, 9600, timeout=1)
              f=ser.read(4)
              ser.close()
              x.append(time.time()-stid)
              y.append(f)
  
  
  class Foo:
      def __init__(self, master):
          print "foo ok"
  
          frame = Tkinter.Frame(root)
  
          self.button_left = Tkinter.Button(frame,text="Start",
                                  command=self.start)
          self.button_left.pack(side="left")
  
          self.button_right = Tkinter.Button(frame,text="Stop",
                                  command=self.stop)
          self.button_right.pack(side="right")
  
          self.button_midt = Tkinter.Button(frame, text='Quit', command=self.terminate)
          self.button_midt.pack(side="bottom")
  
          fig = Figure()
          ax = fig.add_subplot(111, axisbg='black')
  
          canvas = FigureCanvasTkAgg(fig,master=master)
          canvas.show()
          canvas.get_tk_widget().pack(side='top', fill='both', expand=1)
          frame.pack()
  
          line1, = ax.plot(x, y, 'r-') # Returns a tuple of line objects, thus the comma
          line1.set_ydata(y)
          fig.canvas.draw()
  
  
      def start(self):
          global go
          go=1
          print go
  
      def stop(self):
          global go
          go=0
          print go
  
      def terminate(self):
          root.quit()     # stops mainloop
          root.destroy()  # this is necessary on Windows to prevent
                          # Fatal Python Error: PyEval_RestoreThread: NULL tstate
  
  if __name__ == "__main__":
      SensorThread().run()
      Foo(root)
      root.mainloop() 
  </code></pre>
  
  <p>I hope some of you can help my make this code become a program that realtime updates a plot.</p>
  
  <p>Super I have changed the following in the program, </p>
  
  <pre><code>class SensorThread(threading.Thread):
  def run(self):
      global run
      global x
      global y
      global stid
      #print "run er ok"
      if go==1:
          print "go er ok"
          ser = Serial(17, 9600, timeout=1)
          f=ser.read(4)
          ser.close()
          x.append(time.time()-stid)
          y.append(f)
          SensorThread().start()
      else:
          SensorThread().start()
  
  class Foo:
  ....
  
  if __name__ == "__main__":
  SensorThread().start()
  Foo(root)
  root.mainloop() 
  </code></pre>
  
  <p>but it still doesn't update the figure that are plottet, shouldn't it do this in the Foo class? Also now when I exit or quite the python script it still uses 50% of CPU power probably because the Sensor thread now runs for ever!?</p>