es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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 widget price_text. Aquí hay un fragmento de código actualizado para la función do_get():

    def do_get(self):
        self.price_text.delete("1.0", tk.END)
        self.price_text.insert(tk.END, "POR FAVOR ESPERE...")
        self.root.update() # actualizar la GUI
        result = self.lengthy_job()
    

    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.

Comments are closed.