Tkinter中点击MessageBox后自动调用submit函数实现循环计时
Tkinter饮水倒计时自动循环实现
现有一款Tkinter饮水倒计时工具,点击按钮触发submit()函数启动45分钟倒计时,计时结束弹出提示框提醒饮水。目前关闭提示框后需重新点击按钮才能再次启动计时,需优化为点击提示框确定后自动重启新一轮计时。
原代码(存在问题)
注意:原代码缺少messagebox模块导入,直接运行会报错
import time from tkinter import * root = Tk() root.resizable(width=False, height=False) root.geometry("300x250") root['background']='#39E5F9' root.title("Time To Drink Water") minute = StringVar() second = StringVar() minute.set("45") second.set("00") minuteEntry = Entry(root, width=3, font=("Arial", 35, ""), textvariable=minute,justify='center') minuteEntry.place(x=50, y=60) secondEntry = Entry(root, width=3, font=("Arial", 35, ""), textvariable=second,justify='center') secondEntry.place(x=170, y=60) def submit(): # stored in here : 2700 = 45 mins temp = 2700 while temp > -1: # divmod(firstvalue = temp//60, secondvalue = temp%60) mins, secs = divmod(temp, 60) if mins > 60: hours, mins = divmod(mins, 60) minute.set("{0:2d}".format(mins)) second.set("{0:2d}".format(secs)) root.update() time.sleep(1) if (temp == 0): messagebox.showinfo("Time Countdown", "Time To Drink !") temp -= 1 def go(): btn = Button(root, text='Goodbye dehydration!', bd='6', command=submit) btn.place(x=90, y=160) go() root.mainloop()
优化后代码
from tkinter import * import tkinter.messagebox as messagebox root = Tk() root.resizable(width=False, height=False) root.geometry("300x250") root['background']='#39E5F9' root.title("Time To Drink Water") minute = StringVar() second = StringVar() minute.set("45") second.set("00") minuteEntry = Entry(root, width=3, font=("Arial", 35, ""), textvariable=minute, justify='center') minuteEntry.place(x=50, y=60) secondEntry = Entry(root, width=3, font=("Arial", 35, ""), textvariable=second, justify='center') secondEntry.place(x=170, y=60) def countdown(temp): if temp > -1: mins, secs = divmod(temp, 60) minute.set("{0:2d}".format(mins)) second.set("{0:2d}".format(secs)) # 1秒后递归调用countdown,减少剩余时间 root.after(1000, countdown, temp - 1) else: # 计时结束弹出提示,确认后重启计时 messagebox.showinfo("Time Countdown", "Time To Drink !") submit() def submit(): # 启动45分钟倒计时(2700秒) countdown(2700) def go(): btn = Button(root, text='Goodbye dehydration!', bd='6', command=submit) btn.place(x=90, y=160) go() root.mainloop()
关键修改说明
- 解决界面阻塞问题:用Tkinter原生的
after()方法替代while循环和time.sleep(),避免主事件循环被阻塞导致界面假死。 - 实现自动循环:在计时结束的提示框关闭后,直接调用
submit()启动新一轮倒计时。 - 修复依赖缺失:显式导入
tkinter.messagebox模块,解决原代码运行报错问题。
内容的提问来源于stack exchange,提问作者Bruno93600
相关产品推荐
相关产品推荐

