0

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.

1 Answer 1

5

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()
Sign up to request clarification or add additional context in comments.

1 Comment

Oh, wow, that explains why I couldn't get things to work, I didn't know that Tkinter would wait till the loop finished. I really appreciate the help! Thanks a ton.

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.