-1

So I'm trying to make a countdown counter on tkinter that starts from 03:00 minutes and ends on 00:00, actively updated every second. At first I used a while loop with time.sleep() but it freezed my tkinter, so I tried to use tkinter after() method but without any success. What I'm trying to do is to start a timer from 03:00 minutes, goes down - 02:59, 02:58, 02:57,....,00:00 the timer is being represented using a tk.StringVar and should start just when the tkinter window open

This code I wrote raises a maximum recursion depth exception:

class BoggleGUI:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Boggle Game")
        self.root.resizable(False, False)

        self.__sec = tk.StringVar()
        self.__sec_entry = tk.Entry(self.root, textvariable=self.__sec,
                                    width=2, font="Helvetica 14")
        self.__sec_entry.place(x=220, y=12.5)
        self.__sec.set("00")

        self.__mins = tk.StringVar()
        self.__mins_entry = tk.Entry(self.root, textvariable=self.__mins,
                                     width=2, font="Helvetica 14")
        self.__mins_entry.place(x=190, y=12.5)
        self.__mins.set("03")

        self.countdown_timer()

    def countdown_timer(self):
        times = int(self.__mins.get()) * 60 + int(self.__sec.get())
        if times > -1:
            minute, second = divmod(times, 60)
            self.__mins.set("{0:2d}".format(minute))
            self.__sec.set("{0:2d}".format(second))

            self.root.update()

            if times == 0:
                self.__sec.set('00')
                self.__mins.set('00')
            times -= 1
        self.root.after(1000, self.countdown_timer)
Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685

3 Answers3

1

You need to move times =- 1 above:

            minute, second = divmod(times, 60)
            self.__mins.set("{0:2d}".format(minute))
            self.__sec.set("{0:2d}".format(second))

otherwise the update of the time does not happen and realign self.root.after(1000, self.countdown_timer)

Change the function to this and it will work:

    def countdown_timer(self):
        times = int(self.__mins.get()) * 60 + int(self.__sec.get())
        if times > 0:
            times -= 1

            minute, second = divmod(times, 60)
            self.__mins.set("{0:2d}".format(minute))
            self.__sec.set("{0:2d}".format(second))

            self.root.update()

            if times == 0:
                self.__sec.set('00')
                self.__mins.set('00')
            self.root.after(1000, self.countdown_timer)

I have edited the response, also change if times > -1: to if times > 0: for when it reaches zero, otherwise goes negative.

Iliya
  • 432
  • 1
  • 4
  • 9
0

You can also use the threading library. And create a timer function with the sleep method and after utilize

threading.Thread(target=timer).start()

You can read more in the library documentation.

Delrius Euphoria
  • 14,910
  • 3
  • 15
  • 46
Snap
  • 36
  • 3
  • it may not be clear to people reading this what exactly they are supposed to do, can you please add more explanation – Matiiss Jan 01 '22 at 21:52
-3

Maybe try setting the recursion limit to an higer limit(default is set to 1000).

import sys
sys.setrecursionlimit(your_limit)

Let me know if this solve can halp.

  • 2
    This unfortunately doesn't answer the OP's question, and doesn't address their problem. Setting the recursion limit higher is just going to prolong the death of the program, and the error messages. – Sylvester Kruin Jan 01 '22 at 23:28