Как я могу отправить вывод многопроцессорного процесса python в графический интерфейс Tkinter

Я пытаюсь получить вывод из многопроцессорного процесса python, отображаемого в графическом интерфейсе Tkinter.

Я могу отправить вывод из процессов через графический интерфейс в командную оболочку, например, запустив крошечный скрипт в приглашении оболочки:

from multiprocessing import Process  
import sys  

def myfunc(text):    
    print text  
    sys.stdout.flush() 

def f1():  
    p1 = Process(target = myfunc, args = ("Surprise",))  
    p1.start()  

def f2():  
    p2 = Process(target = myfunc, args = ("Fear",))  
    p2.start()  

def fp():  
    myfunc("... and an almost fanatical devotion to the Pope")  

a = Tk()  

b1 = Button(a, text="Process 1", command=f1)  
b1.grid(row=0, column=0, pady=10, padx=10, sticky=SE)  
b2 = Button(a, text="Process 2", command=f2)  
b2.grid(row=0, column=1, pady=10, padx=10, sticky=SE)  
b3 = Button(a, text="Parent", command=fp)  
b3.grid(row=0, column=2, pady=10, padx=10, sticky=SE)  

if __name__ == "__main__":  
    a.mainloop()

Я также могу отправить вывод из родителя в текстовое поле, например, с помощью изменив приведенное выше, закомментировав сброс stdout в myfunc

#    sys.stdout.flush()

и добавив сразу после строки «b3.grid ...» следующее:

class STDText(Text):
    def __init__(self, parent, cnf={}, **kw):
        Text.__init__(self, parent, cnf, **kw)
    def write(self, stuff):
        self.config(state=NORMAL)
        self.insert(END, stuff)
        self.yview_pickplace("end")
        self.config(state=DISABLED)

messages = STDText(a, height=2.5, width=30, bg="light cyan", state=DISABLED)   
messages.grid(row=1, column=0, columnspan=3)
sys.stdout = messages

Однако я могу ' t выяснить, как отправить вывод из процессов в текстовое поле. Я что-то упустил?

8
задан martineau 6 March 2011 в 07:04
поделиться