Joe
Joe

Reputation: 12417

Update Label in Tkinter when calling function

I have a Tkinter GUI and I would like to update the status of the script in a Label, writing which function is being called, but I am having problems with that. I have already seen many answers on here, but still I cant come to a solution. This is the part of the code that I am working on:

run_script(username, password):
    text = StringVar()
    text.set('')
    l=Label(master, text=text, fg='blue')
    l.grid(row=6) #I would like the Label in the row 6
    l.pack()
    text.set('calling my function1')
    my_file.my_function1(username, password)
    text.set('calling my function2')
    my_file.my_function2()

master = Tk()
username = Entry(master, name='username', width=30)
password = Entry(master, name='password', show='*', width=30)
username.grid(row=0, column=1, padx=10, pady=(10,2))
password.grid(row=1, column=1, padx=10, pady=2)
def call_report(username, password):
    run_script(username, password)
Button(master, text='start script',
   command= lambda:call_report(username.get(), password.get(),)).grid(row=6, column=1, sticky=W, pady=10)
mainloop()

The program run perfectly, just the label is not updated. Thanks

Upvotes: 0

Views: 4251

Answers (2)

Joe
Joe

Reputation: 12417

This is my solution that can be used as example:

from Tkinter import *
from time import sleep

def run_script():
    text = StringVar()
    l = Label(master, textvariable=text, fg='blue').grid(row=6)
    text.set('calling my function1')
    master.update()
    sleep(2)
    text.set('end of function1')

def call_report():
    run_script()


if __name__ == '__main__':
   master = Tk()
   username = Entry(master, name='username', width=30)
   password = Entry(master, name='password', show='*', width=30)
   username.grid(row=0, column=1, padx=10, pady=(10,2))
   password.grid(row=1, column=1, padx=10, pady=2)

  button = Button(master, text='start script', command=lambda: call_report())
  button.grid(row=6, column=1, sticky=W, pady=10)

  master.mainloop()

I've changed text to textvariable in Label, and I added master.update(). In this way it force the GUI to redraw. Just to test if the GUI was changing, I tested with sleep. It is possible to update more time (for example before calling a function).

Upvotes: 0

Reblochon Masque
Reblochon Masque

Reputation: 36682

here is one way to do it, using the keyword argument textvariable:

import tkinter as tk


def run_script(username, password):
    text = tk.StringVar()
    text.set('')
    lab = tk.Label(master, textvariable=text, fg='blue')
    lab.grid(row=6)
    text.set('calling my function1')
    # call functions here

def call_report(username, password):
    run_script(username, password)


if __name__ == '__main__':

    master = tk.Tk()
    username = tk.Entry(master, name='username', width=30)
    password = tk.Entry(master, name='password', show='*', width=30)
    username.grid(row=0, column=1, padx=10, pady=(10,2))
    password.grid(row=1, column=1, padx=10, pady=2)

    button = tk.Button(master, text='start script', command=lambda: call_report(username.get(), password.get(),))
    button.grid(row=6, column=1, sticky=tk.W, pady=10)

    master.mainloop()

Note:

The use of pack and grid geometry managers in the same widget is not encouraged.
Please import tkinter as tk: adding tk. is a small price to keep the namespace clean.

Upvotes: 1

Related Questions