Tengo un script de Python que usa Tkinter para la GUI. Mi pequeño script debería crear un widget Toplevel cada X segundos. Cuando ejecuto mi código, el primer widget Toplevel se crea con éxito, pero cuando intenta crear uno, el programa se bloquea.El script de Tkinter con subprocesos se bloquea al crear el segundo widget de Toplevel
Lo que estoy haciendo es usar el método after para llamar a la función startCounting cada 5 segundos junto con el mainloop de root. Cada vez que se llama a esta función, anexo un objeto del widget Toplevel a una lista y comienzo un nuevo hilo que, con suerte, ejecutará el nuevo mainloop.
Estaría muy agradecido si alguien pudiera resolver este problema. Por cierto, este es solo un pequeño guión que estoy usando actualmente para resolver mi problema, lo que me impide continuar con mi proyecto de escuela real.
el código:
import threading,thread
from Tkinter import *
def startCounting():
global root
global topLevelList
global classInstance
topLevelList.append (Toplevel())
topLevelList[len(topLevelList)-1].title("Child")
classInstance.append(mainLoopThread(topLevelList[len(topLevelList)-1]))
root.after(5000,startCounting)
class mainLoopThread(threading.Thread):
def __init__(self,toplevelW):
self.toplevelW = toplevelW
threading.Thread.__init__(self)
self.start()
def run(self):
self.toplevelW.mainloop()
global classInstance
classInstance = []
global topLevelList
topLevelList = []
global root
root = Tk()
root.title("Main")
startCounting()
root.mainloop()
Gracias por la respuesta rápida. Revisaré los documentos. – user430825
@ usuario, de nada! –
He encontrado esta restricción y es exactamente la táctica que uso. Tengo un método que verifica todas las colas. Luego registro ese método con el bucle principal de Tkinter llamando a root.after (ms, my_method).La última llamada en my_method es otra llamada a root.after para que my_method se vuelva a registrar continuamente con el bucle principal. Es importante que las excepciones en my_method no te hagan perder el registro con el mainloop. Es posible que desee poner su llamada a root.after en la parte final de try/finally. –