TheCog19
TheCog19

Reputation: 1209

Interrupting Loops in a tkinter GUI via a button.

I'm coding a timer app, which has encountered a lot of difficulties, but one of the first ones has been in making a loop that can be broken by the press of a button. I've looked into it, and my research shows I should use threading, but I couldn't figure out how it would work.

What I decided to try, then, was to make an exception when I invoked a keyboard interrupt, and then make a button that calls that same interrupt. However, my current code refuses to interrupt when I ctrl-c.

My sample code looks like this

from Tkinter import *
from sys import exit

class Timer:
    def __init__(self, master):
         buttonstart = Button(master, text = "Start", fg = "blue", command = self.start)
         buttonstart.grid(row = 1, column = 0)

         buttonquit = Button(master, text = "Quit", fg = "blue", command= quit)
         buttonquit.grid(row = 1, column = 2)

        global timertext
        timertext = DoubleVar()
        timertext.set(0)
        display = Label(master, textvariable = timertext)
        display.grid(row = 0, column = 0)
        timertext.set(timertext)
    
    def timerlogic(self):
        pass

    def pause(self):
        pass

    def start(self):
        global timertext
        try:
            while True:
                #do things
       except KeyboardInterrupt:
            print "Interrupted"

def lap(self):
    pass

root = Tk()
app = Timer(root)
root.mainloop()
root.destroy()

Basically, I don't think my code as it stands is viable, but I don't know how to edit it to make a loop I can interrupt as needed.

Upvotes: 0

Views: 4712

Answers (1)

user4171906
user4171906

Reputation:

You set some variable to True or False. Also, a while loop interrupts the Tkinter loop so Tkinter will do nothing until the while loop exits. Use Tkinter's after function instead.

from Tkinter import *
##from sys import exit

class Timer:
    def __init__(self, master):
        self.master=master
        buttonstart = Button(master, text = "Start", fg = "blue", command = self.start)
        buttonstart.grid(row = 1, column = 0)

        buttonquit = Button(master, text = "Quit", fg = "blue", command=self.quitit)
        buttonquit.grid(row = 1, column = 2)

        self.timertext = DoubleVar()
        self.timertext.set(0)
        display = Label(master, textvariable = self.timertext)
        display.grid(row = 0, column = 0)
##        timertext.set(timertext)  ## Huh!!
        self.timeit=False

    def increment_timer(self):
        ctr=int(self.timertext.get())
        self.timertext.set(ctr+1)
        if self.timeit:
            self.master.after(500, self.increment_timer)

    def start(self):
        self.timeit=True
        self.increment_timer()

    def quitit(self):
        self.timeit=False

root = Tk()
app = Timer(root)
root.mainloop()

Upvotes: 5

Related Questions