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

点击按钮后Spinbox时间值仍动态变化的Tkinter问题

解决Tkinter休息提醒时间随Spinbox实时变化的问题

问题根源

当前代码中,check_breaks每秒调用set_breaks,而set_breaks每次都会从Spinbox获取最新值进行比较。这就导致用户后续修改Spinbox值时,系统会自动用新值替换之前设置的提醒时间,不符合“点击Set按钮时确定提醒时间”的需求。

解决方案

核心思路是在点击Set按钮时保存当时的Spinbox时间值,后续的定时检查只使用这个保存好的值,不再实时读取Spinbox。具体调整如下:

  • 添加全局变量存储用户确认的休息时间
  • 拆分原set_breaks函数的职责:按钮点击时保存时间并启动循环;定时检查时仅使用保存的值进行对比
  • 确保循环逻辑不会重复启动

修改后的完整代码

from tkinter import *
from tkinter import ttk
from datetime import datetime

root = Tk()
root.title("Fusion Calculator")

first_break_time_label = Label(root, text='1st Break:')
first_break_time_label.grid(row=0, column=0)

first_break_time_hour = Spinbox(root, from_=0, to=23, format='%02.0f')
first_break_time_hour.grid(row=0, column=1)

first_break_time_minute = Spinbox(root, from_=0, to=59, format='%02.0f')
first_break_time_minute.grid(row=0, column=2)

first_break_time_second = Spinbox(root, from_=0, to=59, format='%02.0f')
first_break_time_second.grid(row=0, column=3)

loop_active = False
saved_first_break_time = ""  # 新增:存储用户点击Set时的休息时间

def check_breaks():
    # 仅使用保存好的时间值进行检查
    current_time = datetime.now().strftime("%H:%M:%S")
    if current_time == saved_first_break_time:
        popup_first_break = Toplevel(root)
        popup_first_break.title('Official Break')
        popup_first_break_title_bar = Label(popup_first_break, text='OFFICIAL BREAK', fg='Red')
        popup_first_break_title_bar.pack()
    # 继续定时循环
    root.after(1000, check_breaks)

def set_breaks():
    global loop_active, saved_first_break_time
    # 点击按钮时保存当前Spinbox的时间值
    saved_first_break_time = f'{first_break_time_hour.get()}:{first_break_time_minute.get()}:{first_break_time_second.get()}'
    
    # 仅在循环未启动时启动
    if not loop_active:
        loop_active = True
        check_breaks()

set_breaks_button = ttk.Button(root, text='Set', command=set_breaks)
set_breaks_button.grid(row=1, column=3)

root.mainloop()

关键修改说明

  • saved_first_break_time变量:专门存储用户点击Set按钮时的时间值,后续检查逻辑不再读取Spinbox
  • 拆分check_breaks和set_breaks的职责:
    • set_breaks仅负责保存时间和启动循环
    • check_breaks仅负责定时检查当前时间与保存的时间是否匹配
  • 这样无论后续如何修改Spinbox的值,已经启动的提醒都会使用点击Set时确认的时间,完全符合需求

内容的提问来源于stack exchange,提问作者Muneeb Asmone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:45:35