Yaniv G
Yaniv G

Reputation: 366

tkinter - how to update button text before command function ends?

I have read numerous questions here but none actually answered my puzzle:

openFolderBtnGenerate = Button(top, text="Generate", command=lambda: compute(csv_file_name, lan, lon, alt))

openFolderBtnGenerate.grid(row=5, column=1)

def compute(csv_file_name, lat_0, lon_0, alt_0):
   global openFolderBtnGenerate
   openFolderBtnGenerate['text'] = "Please wait..."
   # here mathematical computation code that takes 10 seconds to accomplish
   ...
   # end

I intended the button text to change before the computation starts so users understand it might take some time to accomplish. What really happens is that the button text is changed only after the computation ends.

How can I make the button text change right after the button is clicked, without having to wait these long 10 seconds?

Upvotes: 0

Views: 657

Answers (2)

Yaroslav  Kornachevskyi
Yaroslav Kornachevskyi

Reputation: 1218

See line "root.update_idletasks()":

import time
import tkinter as tk

root = tk.Tk()

def start_task():
    btn_text.set("Please wait for task to finish...")
    btn.update_idletasks()
    time.sleep(2)
    btn_text.set("Press to start a task")
    

btn_text = tk.StringVar()
btn = tk.Button(root, textvariable=btn_text, command=start_task)
btn_text.set("Press to start a task")

btn.pack()

root.mainloop()

And another sample, without time.sleep() (for UI not to freeze):

import time
import tkinter as tk

root = tk.Tk()

def update_text():
    btn_text.set("Press to start a task")

def start_task():
    btn_text.set("Please wait for task to finish...")
    btn.update_idletasks()
    root.after(2000, update_text)

btn_text = tk.StringVar()
btn = tk.Button(root, textvariable=btn_text, command=start_task)
btn_text.set("Press to start a task")

btn.pack()

root.mainloop()

Upvotes: 1

AaYan Yasin
AaYan Yasin

Reputation: 490

What I think you want to do is just to change text as you press the button then run the function, so a small thing you can do is make another function CODE :

Def function2()
    global openFolderBtnGenerate
    openFolderBtnGenerate['text'] = "Please wait..."
    compute(csv_file_name, lan, lon, alt)

openFolderBtnGenerate = Button(top, text="Generate", command=function2)

openFolderBtnGenerate.grid(row=5, column=1)

def compute(csv_file_name, lat_0, lon_0, alt_0):
   # here mathematical computation code that takes 10 seconds to accomplish
   ...
   # end

It works for me and will surely work for you too.

Upvotes: 1

Related Questions