Python: ¿Es posible crear una etiqueta tkinter que tenga una cadena dinámica cuando una función se ejecuta en segundo plano?

He creado una GUI tkinter para mi script de python. Cuando ejecuto el script, quiero una cadena dinámica en uno de los widgets de Label en la ventana de la GUI, que mostrará:

“Trabajando.” Luego: “Trabajando ..” luego “Trabajando …”

y luego empezar desde “Trabajar”. de nuevo hasta que se complete el script.

(En realidad prefiero una barra de progreso en esta área)

¿Es posible?

Escribí dos guiones simples para ayudar a demostrar cómo hacer lo que quieres. El primero es usar la etiqueta:

import tkinter as tk root = tk.Tk() status = tk.Label(root, text="Working") status.grid() def update_status(): # Get the current message current_status = status["text"] # If the message is "Working...", start over with "Working" if current_status.endswith("..."): current_status = "Working" # If not, then just add a "." on the end else: current_status += "." # Update the message status["text"] = current_status # After 1 second, update the status root.after(1000, update_status) # Launch the status message after 1 millisecond (when the window is loaded) root.after(1, update_status) root.mainloop() 

La siguiente es usar una barra de progreso:

 import tkinter as tk # You will need the ttk module for this from tkinter import ttk def update_status(step): # Step here is how much to increment the progressbar by. # It is in relation to the progressbar's length. # Since I made the length 100 and I am increasing by 10 each time, # there will be 10 times it increases before it restarts progress.step(step) # You can call 'update_status' whenever you want in your script # to increase the progressbar by whatever amount you want. root.after(1000, lambda: update_status(10)) root = tk.Tk() progress = ttk.Progressbar(root, length=100) progress.pack() progress.after(1, lambda: update_status(10)) root.mainloop() 

Sin embargo, tenga en cuenta que no pude hacer demasiado con la secuencia de comandos de la barra de progreso porque las barras de progreso son un poco difíciles y necesitan ser personalizadas exactamente a su secuencia de comandos. Simplemente lo escribí para tal vez arrojar un poco de luz sobre el tema. La parte principal de mi respuesta es el script de la etiqueta.

Sí, es posible. Hay dos maneras de hacerlo:

  1. Cuando quiera actualizar la etiqueta de su código, puede llamar a the_widget.configure(the_text) . Esto cambiará el texto de la etiqueta.

  2. Puede crear una instancia de un tkinter.StringVar y asignarlo al atributo de textvariable de texto de una etiqueta. Siempre que cambie el valor de la variable (a través de the_variable.set(the_text) , la etiqueta se actualizará automáticamente.

Tenga en cuenta que para que cualquiera de estos funcione, el bucle de eventos debe poder procesar eventos (es decir, no verá nada si su función tarda mucho tiempo en ejecutarse y nunca llama a update_idletasks o vuelve a ingresar al ciclo de eventos) .