Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I create an automatically updating GUI using Tkinter?

from Tkinter import *
import time
#Tkinter stuff

class App(object):
    def __init__(self):
        self.root = Tk()

        self.labeltitle = Label(root, text="",  fg="black", font="Helvetica 40 underline bold")
        self.labeltitle.pack()

        self.labelstep = Label(root, text="",  fg="black", font="Helvetica 30 bold")
        self.labelstep.pack()

        self.labeldesc = Label(root, text="",  fg="black", font="Helvetica 30 bold")
        self.labeldesc.pack()

        self.labeltime = Label(root, text="",  fg="black", font="Helvetica 70")
        self.labeltime.pack()

        self.labelweight = Label(root, text="",  fg="black", font="Helvetica 25")
        self.labelweight.pack()

        self.labelspeed = Label(root, text="",  fg="black", font="Helvetica 20")
        self.labelspeed.pack()

        self.labeltemp = Label(root, text="", fg="black", font="Helvetica 20")
        self.labeltemp.pack()

        self.button = Button(root, text='Close recipe', width=25, command=root.destroy)
        self.button.pack()

    def Update(self, label, change):
        label.config(text=str(change))

def main():
    app = App()
    app.mainloop()

if __name__ == "__main__":
    main()

I'm trying to create a recipe display which will show the step, instructions, weight and other variables on a screen in a Tkinter GUI.

However, I do not know how to update the GUI to change with each new step of the recipe, as the content has to be dynamically updated based on user input (taken from a server). How can I achieve updating of the GUI's other elements based on the change in steps?

like image 749
RainingEveryday Avatar asked Jul 20 '14 09:07

RainingEveryday


People also ask

What does update () do in Tkinter?

Update method processes all the pending idle tasks, unvisited events, calling functions, and callbacks. The method is applicable for updating and processing all the events or tasks such as redrawing widgets, geometry management, configuring the widget property, etc.

How do you make a modern GUI in Tkinter?

The only thing the user needs to do is design an interface with Figma, and then paste the Figma file URL and API token into Tkinter Designer. Tkinter Designer will automatically generate all the code and images required to create the GUI in Tkinter.

Is Tkinter still used in 2022?

No, Tkinter is outdated, and most people want something better looking these days. I really liked Tk when I first used it, but that was back in the nineties, I wouldn't consider using it now. I wouldn't use Python for a desktop application these days, too many better options.

How do you make an interactive GUI in Python?

Tkinter ProgrammingImport the Tkinter module. Create the GUI application main window. Add one or more of the above-mentioned widgets to the GUI application. Enter the main event loop to take action against each event triggered by the user.


2 Answers

You can use after() to run function after (for example) 1000 miliseconds (1 second) to do something and update text on labels. This function can run itself after 1000 miliseconds again (and again).

It is example with current time

from Tkinter import *
import datetime

root = Tk()

lab = Label(root)
lab.pack()

def clock():
    time = datetime.datetime.now().strftime("Time: %H:%M:%S")
    lab.config(text=time)
    #lab['text'] = time
    root.after(1000, clock) # run itself again after 1000 ms
    
# run first time
clock()

root.mainloop()

BTW: you could use StringVar as sundar nataraj Сундар suggested


EDIT: (2022.01.01)

Updated to Python 3 with other changes suggested by PEP 8 -- Style Guide for Python Code

import tkinter as tk   # PEP8: `import *` is not preferred
import datetime

# --- functions ---
# PEP8: all functions before main code
# PEP8: `lower_case_name` for funcitons
# PEP8: verb as function's name
                     
def update_clock():
    # get current time as text
    current_time = datetime.datetime.now().strftime("Time: %H:%M:%S")
    
    # udpate text in Label
    lab.config(text=current_time)
    #lab['text'] = current_time
    
    # run itself again after 1000 ms
    root.after(1000, update_clock) 

# --- main ---

root = tk.Tk()

lab = tk.Label(root)
lab.pack()
    
# run first time at once
update_clock()

# run furst time after 1000ms (1s)
#root.after(1000, update_clock)

root.mainloop()
like image 124
furas Avatar answered Nov 14 '22 23:11

furas


if you want to change label dynamically

self.dynamiclabel=StringVar()
self.labeltitle = Label(root, text=self.dynamiclabel,  fg="black", font="Helvetica 40 underline bold")
self.dyanamiclabel.set("this label updates upon change")
self.labeltitle.pack()

when ever you get new value then just use .set()

self.dyanamiclabel.set("Hurrray! i got changed")

this apply to all the labels.To know more read this docs

like image 20
sundar nataraj Avatar answered Nov 14 '22 21:11

sundar nataraj