使用“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:
,因为当它达到零时,否则变为负数。
所以我想在 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:
,因为当它达到零时,否则变为负数。