python Tkinter,Queue,Threading,给出堆栈空间错误

时间:2013-12-11 04:59:54

标签: python multithreading tkinter queue

我试图通过使用Queus和Threading将raw_input()连接到Tkinter gui。这是我的代码:

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))

有人可以解释原因吗?

1 个答案:

答案 0 :(得分:0)

经过深入搜索,我发现了这篇文章:here

我不确定这是不是问题,但它通过将gui mainloop()放在第二个线程中,以改编我的代码的方式激发了我。

通过这种方式,它就像一个魅力,虽然我仍然不确定为什么会有这样的行为。