python-3.x - para - tkinter python 3 install linux
Multiprocesamiento-comunicación de tuberÃas de tkinter (3)
Tengo una pregunta sobre multiprocesamiento y tkinter. Tengo algunos problemas para que mi proceso funcione en paralelo con la GUI de tkinter. He creado un ejemplo simple para practicar y he estado leyendo para comprender los conceptos básicos del multiprocesamiento. Sin embargo, al aplicarlos a tkinter, solo se ejecuta un proceso en ese momento. ( Uso del módulo de multiprocesamiento para actualizar la GUI de Tkinter ). Además, cuando agregué la cola para comunicarme entre procesos ( ¿Cómo usar la cola de multiprocesamiento en Python? ), El proceso ni siquiera se iniciará.
Objetivo: me gustaría tener un proceso que cuente hacia abajo y ponga los valores en la cola y uno para actualizar tkinter después de 1 segundo y mostrarme los valores.
Todos los consejos son amablemente apreciados
Saludos cordiales, S
EDITAR : Quiero que los datos estén disponibles cuando se llame al método after. Entonces, el problema no está en la función after, sino en el método invocado por la función after. Tomará 0,5 segundos completar el cálculo cada vez. En consecuencia, la GUI no responde durante medio segundo, cada segundo.
EDIT2 : se realizaron correcciones al código en función de los comentarios, pero este código aún no se está ejecutando.
class Countdown():
"""Countdown prior to changing the settings of the flows"""
def __init__(self,q):
self.master = Tk()
self.label = Label(self.master, text="", width=10)
self.label.pack()
self.counting(q)
# Countdown()
def counting(self, q):
try:
self.i = q.get()
except:
self.label.after(1000, self.counting, q)
if int(self.i) <= 0:
print("Go")
self.master.destroy()
else:
self.label.configure(text="%d" % self.i)
print(i)
self.label.after(1000, self.counting, q)
def printX(q):
for i in range(10):
print("test")
q.put(9-i)
time.sleep(1)
return
if __name__ == ''__main__'':
q = multiprocessing.Queue()
n = multiprocessing.Process(name=''Process2'', target=printX, args = (q,))
n.start()
GUI = Countdown(q)
GUI.master.mainloop()
No se ejecutará ningún código después de llamar a mainloop
hasta que la ventana se haya destruido. mainloop
comenzar su otro proceso antes de llamar a mainloop
.
Estás llamando mal la función después. El segundo argumento debe ser el nombre de la función para llamar, no una llamada a la función.
Si lo llamas así
self.label.after(1000, self.counting(q))
Llamará al counting(q)
y esperará a que se emita un valor de retorno como función para llamar.
Para asignar una función con argumentos, la sintaxis es
self.label.after(1000, self.counting, q)
Además, comience su segundo proceso antes de crear la ventana y llamar al counting
.
n = multiprocessing.Process(name=''Process2'', target=printX, args = (q,))
n.start()
GUI = Countdown(q)
GUI.master.mainloop()
Además, solo necesitas llamar a mainloop
una vez. Cualquier posición que tenga funciona, pero solo necesita una
Editar: También necesita poner (9-i)
en la cola para hacer que la cuenta cuente hacia abajo.
q.put(9-i)
Dentro de la función printX
El multiprocesamiento no funciona dentro del cuaderno interactivo Ipython. Multiproceso que funciona en Python pero no en iPython. Como alternativa, puede utilizar spyder.