使用“after”时计时器从不更新

Timer never updates when using `after`

所以我想在 tkinter 上做一个倒计时计数器,从 03:00 分钟开始到 00:00 结束,每秒主动更新一次。 起初我使用 while 循环 time.sleep() 但它冻结了我的 tkinter,所以我尝试使用 tkinter after() 方法但没有成功。 我想做的是从 03:00 分钟开始计时,开始计时 - 02:59、02:58、02:57、....、00:00 计时器使用 tk.StringVar 表示,并且应该在 tkinter window 打开

时启动

我写的这段代码引发了最大递归深度异常:

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)

也许尝试将递归限制设置为更高的限制(默认设置为 1000)。

import sys
sys.setrecursionlimit(your_limit)

让我知道这个解决方案是否有帮助。

您还可以使用线程库。并使用 sleep 方法创建一个定时器函数,然后使用

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

您可以在库文档中阅读更多内容。

您需要移动次数 =- 1 以上:

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

否则不会更新时间并重新对齐self.root.after(1000, self.countdown_timer)

把函数改成这样就可以了:

    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)

我已经编辑了回复,也将 if times > -1: 更改为 if times > 0:,因为当它达到零时,否则变为负数。