Nick Bonne
Nick Bonne

Reputation: 75

Need help ignoring button press. Tkinter

I am working on making a stopwatch program. I can't get the start button to do nothing if the timer is already running.

When I search, I see the same 14 year old code. I'd find it hard to believe that all these individuals in the past 14 years have independently arrived at the same solution.

As a beginner, I'd really like to know what I'm doing wrong with what I've written instead of copy/pasting and moving on.

from tkinter import *
import time
import datetime


class Window(Frame):

    def __init__(self, master = None):
        Frame.__init__(self, master)

        self.master = master

        self.init_window()

    def init_window(self):

        self.master.title('Stopwatch')

        self.pack(fill=BOTH, expand=1)

        quit_button = Button(self, text = 'Quit', command = self.client_exit)
        quit_button.config(width = 9)
        quit_button.place(x=230)

        start_button = Button(self, text = 'Start', command = self.timer_start)
        start_button.config(width= 10)
        start_button.place(x=0, y=0)

        stop_button = Button(self, text = 'Stop', command = self.timer_stop)
        stop_button.config(width = 10)
        stop_button.place(x=80)

        reset_button = Button(self, text = 'Reset', command = self.timer_reset)
        reset_button.config(width = 10)
        reset_button.place(x=160)

        self.is_timer_running = False

    def client_exit(self):
        exit()

    def timer_start(self):
        global sec1
        sec1 = time.time()
        if self.is_timer_running == False:
            self.is_timer_running = True
            def tick():
                if self.is_timer_running == True:
                    sec = time.time()
                    sec = datetime.timedelta(seconds = sec - sec1)
                    clock['text'] = sec
                    clock.after(100, tick)
            tick()

    def timer_stop(self):
        stop_time = time.time()
        if self.is_timer_running == True:
            self.is_timer_running = False
            def tick_stop():
                stop = datetime.timedelta(seconds = stop_time - sec1)
                clock['text'] = stop
            tick_stop()

    def timer_reset(self):
        self.is_timer_running = False
        clock['text'] = '00:00:00'

Upvotes: 3

Views: 511

Answers (1)

Harrison
Harrison

Reputation: 5386

Set the state of the button to disabled immediately after it's clicked (make sure to update it), and then set it back to normal when the timer stops running.

start_button.config(state = 'disabled')
start_button.update()

# do whatever you need to do i.e run the stop watch

start_button.update()
start_button.config(state = 'normal') 

And thanks to @NickBonne for further clarification :)

You need to add self.start_button = start_button and self.stop_button = stop_button in init_window(). Then you can use self.start_button.config(state="disabled")

Upvotes: 4

Related Questions