Ejecutar un bucle infinito en el backgroung en Tkinter

Me gustaría que el código se ejecute en segundo plano y que actualice mi GUI periódicamente. ¿Cómo puedo lograr esto?

Por ejemplo, supongamos que quiero ejecutar algo como esto en el fondo del código GUI que puede ver a continuación:

x = 0 while True: print(x) x = x + 1 time.sleep(1) 

Este es el código GUI:

 class GUIFramework(Frame): def __init__(self,master=None): Frame.__init__(self,master) self.master.title("Volume Monitor") self.grid(padx=10, pady=10,sticky=N+S+E+W) self.CreateWidgets() def CreateWidgets(self): textOne = Entry(self, width=2) textOne.grid(row=1, column=0) listbox = Listbox(self,relief=SUNKEN) listbox.grid(row=5,rowspan=2,column=0,columnspan=4,sticky=N+W+S+E,pady=5) listbox.insert(END,"This is an alert message.") if __name__ == "__main__": guiFrame = GUIFramework() guiFrame.mainloop() 

No está claro qué se supone que haga su código en la parte superior; sin embargo, si solo desea llamar a una función cada segundo (o cada cantidad de segundos que desee), puede utilizar el método after .

Entonces, si solo quieres hacer algo con textOne , probablemente hagas algo como:

 ... textOne = Entry(self, width=2) textOne.x = 0 def increment_textOne(): textOne.x += 1 # register "increment_textOne" to be called every 1 sec self.after(1000, increment_textOne) 

Podría hacer de esta función un método de su clase (en este caso lo llamé callback ), y su código se vería así:

 class Foo(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.x = 0 self.id = self.after(1000, self.callback) def callback(self): self.x += 1 print(self.x) #You can cancel the call by doing "self.after_cancel(self.id)" self.id = self.after(1000, self.callback) gui = Foo() gui.mainloop() 

Si realmente desea ejecutar un bucle infinito distinto, no tiene más remedio que usar un subproceso separado y comunicarse a través de una cola segura de subprocesos. Sin embargo, excepto en circunstancias bastante inusuales, nunca debería necesitar ejecutar un bucle infinito. Después de todo, ya tiene un bucle infinito en ejecución: el bucle de eventos. Entonces, cuando dices que quieres un bucle infinito, realmente estás preguntando cómo hacer un bucle infinito dentro de un bucle infinito.

@mgilson ha dado un buen ejemplo sobre cómo hacerlo after , que debe considerar intentar antes de usar hilos. El subprocesamiento hace posible lo que usted desea, pero también hace que su código sea mucho más complejo.