2013-12-11 81 views
1

我想通過使用Queus和線程連接raw_input()到Tkinter gui。這裏是我的代碼:Python的Tkinter,隊列,線程,給出了堆棧空間錯誤

import Tkinter 
import time 
import threading 
import Queue 

class UI(Tkinter.Frame): 

    def __init__(self, master=None, queue=None): 
     self.queue = queue 
     Tkinter.Frame.__init__(self, master) 
     self.master.title("what does console say") 
     self.master.minsize(40, 30) 
     swd = self.master.winfo_screenwidth() 
     fwd = 320 
     fht = 240 
     self.master.geometry('{0:d}x{1:d}+{2:d}+{3:d}'.format(
       fwd, fht, swd - fwd, 0)) 

     self.message = Tkinter.StringVar() 
     mesgbox = Tkinter.Label(master, textvariable=self.message) 
     mesgbox.pack(fill=Tkinter.BOTH, expand=1) 

     self.pack() 
     self.processqueue() 

    def processqueue(self): 
     try: 
      message = '\n'.join([self.message.get(), 
           self.queue.get_nowait()]) 
     except Queue.Empty: 
      pass 
     else: 
      self.message.set(message) 
     self.master.after(100, self.processqueue) 


class ThreadedTask(threading.Thread): 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.daemon = 1 
     self.queue = queue 
    def run(self): 
     i = 0 
     while True: 
      i += 1 
      message = raw_input('put some words:') 
      self.queue.put("[Message] {0:s}".format(message)) 

queue = Queue.Queue() 
gui = UI(queue=queue) 
job = ThreadedTask(queue) 
job.start() 
gui.mainloop() 

不過,我得到以下錯誤:

error in background error handler: 
out of stack space (infinite loop?) 
    while executing 
"::tcl::Bgerror {out of stack space (infinite loop?)} {-code 1 -level 0 -errorcode NONE -errorinfo {out of stack space (infinite loop?) 
    ("after" sc..." 

誰能幫我呢?先謝謝你!

的另一件事是,這個代碼的工作,如果我不使用的raw_input(),但生成的文本一些機器,即:

def run(self): 
     i = 0 
     while True: 
      i += 1 
      time.sleep(0.5) 
      self.queue.put("[Message] {0:d}".format(i)) 

誰能解釋一下爲什麼?

+0

它按預期對我工作..... –

+0

你在什麼機器?我的Fedora 18,python 2.7.3。 我周圍搜索了一下,發現這可能是tk沒有與啓用線程編譯的結果。然而,我只是想知道爲什麼只有當我使用raw_input()時引發異常。 –

+0

我在Windows 32位,python 2.7.3,tk 8.5順便說一句,我不認爲這是錯誤原因的原因,否則它不會爲你工作,但我不知道雖然... –

回答

0

了深刻的搜索後,我發現這個職位:here

我不知道這是否是完全的問題,但它激勵着我,在我改造我的代碼的方式,通過將GUI主循環( )在第二個線程中。

這樣,它就像一個魅力,但我仍然不完全是爲什麼有這樣的行爲。