Python+tkinter: El widget de texto no cambia el texto inmediatamente.
Tengo un widget tk.Text() y un botón. Cuando se hace clic en el botón, quiero cambiar el texto en el widget Text y luego realizar un trabajo prolongado. Aquí hay un fragmento de código de la función de comando del botón:
price_text.delete("1.0", tk.END)
price_text.insert(tk.END, 'POR FAVOR ESPERA..')
result = self.the_lengthy_job()
Sin embargo, el mensaje ‘POR FAVOR ESPERA..’ no se muestra hasta que self.the_lengthy_job() se complete. ¿Es posible mostrarlo antes de que comience the_lengthy_job()?
—EDIT—
Aquí hay más código:
import tkinter as tk
import pandas_datareader as web
class GUI:
def __init__(self):
self.root = tk.Tk()
self.root.geometry("800x480")
self.price_text = tk.Text(self.root)
self.price_text.grid(row=0, column=0)
tk.Button(self.root, text="Obtener", command=self.do_get).grid(row=1, column=0)
self.root.mainloop()
def do_get(self):
self.price_text.delete("1.0", tk.END)
self.price_text.insert(tk.END, "POR FAVOR ESPERA..")
result = self.lengthy_job()
def lengthy_job(self):
tickers = ["GOOG", "AAPL", "MSFT", "IBM", "F", "AMZN", "NVDA", "NFLX", "DISH", "BABA", "JD",
"SHOP", "PDD", "CSCO", "AMD", "INTC", "TXN", "MU", "QCOM"]
return web.DataReader(tickers, 'yahoo', start="2020-1-1", end="2020-1-31")
GUI()
En este ejemplo, “POR FAVOR ESPERA..” solo aparece después de que lengthy_job() haya terminado.
davy.ai
Sí, es posible mostrar el mensaje “POR FAVOR ESPERE…” antes de iniciar la tarea larga. Esto se puede lograr actualizando la GUI utilizando el método
update()
después de insertar el mensaje en el widgetprice_text
. Aquí hay un fragmento de código actualizado para la funcióndo_get()
:Al agregar la línea
self.root.update()
después de insertar el mensaje, la GUI se actualizará inmediatamente y se mostrará el mensaje antes de que comience la tarea larga.