You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:28:01