Sto cercando di ottenere l'output da un processo di multiprocessing python visualizzato in un gui di Tkinter.Come posso inviare l'output del processo di multiprocessing di Python a un Tkinter gui
posso inviare l'output da processi tramite una GUI per una shell di comando, ad esempio eseguendo il piccolo script di fllowing al prompt della shell:
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()
posso anche inviare in uscita dal genitore ad un casella di testo, ad esempio modificando il sopra commentando il lavaggio di stdout in myfunc
# sys.stdout.flush()
e aggiungendo subito dopo il "b3.grid ..." linea la seguente:
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
Tuttavia non riesco a capire come inviare l'output dai processi alla casella di testo. Mi sto perdendo qualcosa di semplice?
Unutbu - Grazie per la risposta molto utile. Certamente risolve il mio esempio di giocattolo. (Nell'applicazione reale i processi eseguiranno funzioni diverse e genereranno messaggi di output spontaneamente (cioè non stamperanno alcun testo specifico dato loro come parametro). Mi chiedevo se fosse possibile trovare un "cheapo" per evitare di entrare nei tubi, ma immagino che probabilmente sia la strada da percorrere – tchaz