CodingN00p
CodingN00p

Reputation: 1

After() method in tkinter for timer

I want to start a timer when the user clicks a button for the first time in my number click game. I tried to use the after method for this, but when I click a button, the timer stays at 0. The rest of the code works fine without any error messages. Here's the code:

import tkinter as tk
from random import randint

# create window
window = tk.Tk()
window.title('Clicker')

# create list for random numbers
new_list = []


# define time count:
def time_event():
    global current_time, after_id
    if clock_started:
        current_time += 1
        clock["text"] = str(current_time)
        after_id = clock.after(1000, time_event)


# define click event
def click_event(event):
    global clock_started
    new_button = event.widget
    clicked_val = int(new_button["text"])
    clock_started = True
    if not clock_started:
        clock_started = True
        clock.after(1000, time_event)
    if clicked_val == new_list[0]:
        del new_list[0]
        new_button["state"] = tk.DISABLED
    if len(new_list) == 0:
        clock.started = False
        clock.after_cancel(after_id)


# create buttons
for i in range(25):
    new_num = randint(1, 999)
    while i in new_list:
        new_num = randint(1, 999)
    new_list.append(new_num)
    new_list.sort()
    new_button = tk.Button(window, text=new_num)
    new_button.grid(column=i // 5, row=i % 5)
    new_button.bind("<Button-1>", click_event)


# create clock
current_time = 0
clock = tk.Label(window, text=str(current_time))
clock.grid(column=2, row=6)
clock_started = False

# run game
window.mainloop()

Upvotes: 0

Views: 269

Answers (1)

astqx
astqx

Reputation: 2096

In your code, clock_started has been initialized to True which implies that this condition if not clock_started: will not be satisfied to begin with and hence the timer doesn't work without giving an error. Your final click_event(event) should look like this:

def click_event(event):
    global clock_started
    new_button = event.widget
    clicked_val = int(new_button["text"])
    clock_started = False
    if not clock_started:
        clock_started = True
        clock.after(1000, time_event)
    if clicked_val == new_list[0]:
        del new_list[0]
        new_button["state"] = tk.DISABLED
    if len(new_list) == 0:
        clock.started = False
        clock.after_cancel(after_id)

Upvotes: 1

Related Questions