title: Python - Tkinter window and endless loop class at the same time
body: <p>I've got the problem that I want to call some code after the mainloop of Python which is written in a secound class. But this Class contains a possible endless loop which will cause Tkinter to freeze when I try to call  the mainloop() after it. Is it possible to get the data from the first class to the Window even though it may could be endless?
  here is my current code:</p>
  
  <pre><code>from tkinter import *
  import re
  import threading
  import _thread as thread
  from time import sleep
  
  class interpret(threading.Thread):
      def __init__(self):
          threading.Thread.__init__(self)
          print("some text")
          self.read()   
      def read(self):
          laenge = self.file_len(self.file)
          try:
              while self.line &lt; laenge and not self.graceful:
                  fp = open(self.file)
                  for i, line in enumerate(fp):
                      if i == self.line:
                          content = line.rstrip().lower()
                          content = content.split(";", 1)[0]
                          content = self.replace(content)
                          #simply is getting some Info of the File, can change self.line
                          #it also could trigger an input(), which I want to replace by the canvas input
                          self.get_operator(content)
                  self.line += 1
                  fp.close()
          except KeyboardInterrupt:
              print("\n\n-----Info-----")
              for i in range(len(self.memory)):
                  print(i,":",self.memory[i])
          except IndexError:
              print("Buffer Overflow in line",self.line+1)
  class Window(threading.Thread):
      pointer = 40
      h= 500
      txt = []
      master = Tk()
      buffer_txt = []
      expect_input = True
      input_method = 1 #0=Nothing,1=Alphanumeric,2=Everything
  
      def __init__(self):
          threading.Thread.__init__(self)
          self.w = Canvas(self.master, width=500, height=self.h, background="black",highlightthickness=0)
          self.w.pack()
          self.master.bind("&lt;Return&gt;", self.send)
          self.master.bind("&lt;Key&gt;", self.to_buffer)
          self.w.update()
          mainloop() 
      def update(self):
          if self.txt != []:
              for i in range(len(self.txt)):
                  self.w.coords(self.txt[i], 20, ((i*15)+30))
      def text_add(self,text):
          if(len(self.txt) &gt; 30):
              self.txt = self.txt[1:]
              self.w.delete(self.txt[0])
              self.update()
          self.txt += [self.w.create_text(20, self.pointer, text=text, fill="white",anchor="w")]
          if self.pointer &lt; 485:
              self.pointer += 15
          self.w.update()
      def to_buffer(self,event):
          if self.expect_input:
              if (((event.keycode &gt;= 48 and event.keycode &lt;= 57) or (event.keycode &gt;= 65 and event.keycode &lt;= 90) or (event.keycode &gt;= 97 and event.keycode &lt;= 122) or event.keycode == 8 or event.keycode == 32) and self.input_method == 1) or self.input_method == 2:
                  print("My Mode:",self.input_method,"My keycode:",event.keycode)
                  self.w.delete(self.txt[len(self.txt)-1])
                  self.txt = self.txt[:len(self.txt)-1]
                  print("Out:",str(event.keycode))
                  s = str(event.char)
                  if event.keycode == 8 and len(self.buffer_txt) &gt; 0:
                      del self.buffer_txt[-1]
                  else:
                      self.buffer_txt += [s]
                  t = "".join(self.buffer_txt)
                  self.txt += [self.w.create_text(20, self.pointer, text=t, fill="white",anchor="w")]
                  self.update()
              else:
                  print("My Keycode:",event.keycode)
      #text_add(repr(event.char))
      def send(self,none):
          t = "".join(self.buffer_txt)
          self.buffer_txt = []
          print("text:",t)
          self.text_add(t)
          #This is the variable I want to send to the interpret Class as an input() alternative
          self.text = t
          self.w.delete(self.txt[-1])
  
  if __name__ == '__main__':
      thread1 = Window()
      thread2 = interpret()
  
      thread1.start()
      thread2.start()
  
      thread1.join()
      thread2.join()
  </code></pre>
  
  <p>What I try to do is that the Window should be an input alternative in a bit more flexible way. I cut out some unnecessary Code, I hope it is still good to understand what I try to do.</p>