standard para libreria library examples descargar python-3.x tkinter python-multiprocessing

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