Estoy tratando de obtener una salida de un proceso de multiproceso de python que se muestra en una interfaz gráfica de usuario de Tkinter.¿Cómo puedo enviar la salida del proceso de multiprocesamiento de Python a una interfaz gráfica de usuario de Tkinter?
puedo enviar la salida de los procesos a través de una interfaz gráfica de usuario a una consola de comandos, por ejemplo mediante la ejecución de la pequeña secuencia de comandos fllowing en el intérprete de comandos:
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()
También puedo enviar la salida de la padres a una cuadro de texto, por ejemplo, modificando la anterior comentando la enrojecimiento de la salida estándar en myfunc
# sys.stdout.flush()
y añadiendo inmediatamente después de la "b3.grid ..." línea de lo siguiente:
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
Sin embargo, no puedo encontrar la forma de enviar los resultados desde los Procesos al cuadro de texto. ¿Me estoy perdiendo algo simple?
Unutbu - Gracias por la respuesta tan útil. Ciertamente resuelve mi ejemplo de juguete. (En la aplicación real, los procesos ejecutarán diferentes funciones y producirán mensajes de salida de forma espontánea (es decir, no imprimiendo algún texto específico que se les dé como parámetro). Me he preguntado si era posible encontrar un 'cheapo' para evitar meterme en las tuberías, pero supongo que ese es el camino a seguir. – tchaz