点击按钮后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
相关产品推荐
相关产品推荐

