4

I would like the code to run in the background and to update my GUI periodically. How can I accomplish this?

For example, suppose I want to execute something like this in the background of the GUI code you can see below:

x = 0

while True:
   print(x)
   x = x + 1
   time.sleep(1)

This is the GUI code:

class GUIFramework(Frame):

    def __init__(self,master=None):
        Frame.__init__(self,master)
        self.master.title("Volume Monitor")
        self.grid(padx=10, pady=10,sticky=N+S+E+W)
        self.CreateWidgets()

    def CreateWidgets(self):
        textOne = Entry(self, width=2)
        textOne.grid(row=1, column=0)

        listbox = Listbox(self,relief=SUNKEN)
        listbox.grid(row=5,rowspan=2,column=0,columnspan=4,sticky=N+W+S+E,pady=5)
        listbox.insert(END,"This is an alert message.")

if __name__ == "__main__":
    guiFrame = GUIFramework()
    guiFrame.mainloop()

2 Answers 2

10

It is a little unclear what your code at the top is supposed to do, however, if you just want to call a function every second (or every the amount of seconds you want), you can use the after method.

So, if you just want to do something with textOne, you'd probably do something like:

...
textOne = Entry(self, width=2)
textOne.x = 0

def increment_textOne():
    textOne.x += 1

    # register "increment_textOne" to be called every 1 sec
    self.after(1000, increment_textOne) 

You could make this function a method of your class (in this case I called it callback), and your code would look like this:

class Foo(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.x = 0
        self.id = self.after(1000, self.callback)

    def callback(self):
        self.x += 1
        print(self.x)
        #You can cancel the call by doing "self.after_cancel(self.id)"
        self.id = self.after(1000, self.callback)  

gui = Foo()
gui.mainloop()
Sign up to request clarification or add additional context in comments.

Comments

2

If you truly want to run a distinct infinite loop you have no choice but to use a separate thread, and communicate via a thread safe queue. However, except under fairly unusual circumstances you should never need to run an infinite loop. Afte all, you already have an infinite loop running: the event loop. So, when you say you want an infinite loop you are really asking how to do an infinite loop inside an infinite loop.

@mgilson has given a good example on how to do that using after, which you should consider trying before trying to use threads. Threading makes what you want possible, but it also makes your code considerably more complex.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.