Python倒计时计时器问题:秒数跳转与暂停续启功能实现求助
Tkinter倒计时计时器问题解决
以下是针对你提出的两个问题的完整解决方案,包含修改后的代码和关键逻辑说明:
修改后的完整代码
import tkinter as tk from tkinter import StringVar, Label, BOLD import customtkinter class Product: def __init__(self, window): self.tablero_principal = window self.tablero_principal.title('Tablero') self.tablero_principal.attributes('-fullscreen', True) self.tablero_principal.configure(background='BLACK') frame_tablero_arriba = customtkinter.CTkFrame(self.tablero_principal, corner_radius=0, fg_color='black') frame_tablero_arriba.pack(fill='both', expand=True) # 保存当前倒计时的分秒数值 self.current_minutes = 12 self.current_seconds = 12 self.text_minutos = StringVar(value=str(self.current_minutes)) self.text_segundos = StringVar(value=str(self.current_seconds)) self.label_minutos = Label(frame_tablero_arriba, font=('DS-Digital', 270, BOLD), textvariable=self.text_minutos, bg='black', foreground='red') self.label_minutos.grid(column=1, row=0, rowspan=6, padx=20) self.label_puntos = Label(frame_tablero_arriba, font=('DS-Digital', 270, BOLD), text=":", bg='black', foreground='red') self.label_puntos.grid(column=2, row=0, rowspan=6) self.label_segundos = Label(frame_tablero_arriba, font=('DS-Digital', 270, BOLD), textvariable=self.text_segundos, bg='black', foreground='red') self.label_segundos.grid(column=3, row=0, rowspan=6, padx=20) # 计时器状态控制变量 self.running = False self.after_id = None button_tiempo_iniciar = customtkinter.CTkButton(master=frame_tablero_arriba, width=120, command=self.start_countdown, corner_radius=4, fg_color="darkorange", hover_color="darkorange4", text='Iniciar') button_tiempo_iniciar.grid(column=4, row=0, padx=20, pady=10) button_tiempo_parar = customtkinter.CTkButton(master=frame_tablero_arriba, width=120, command=self.pause_countdown, corner_radius=4, fg_color="darkorange", hover_color="darkorange4", text='Detener') button_tiempo_parar.grid(column=4, row=1, padx=20, pady=10) button_tiempo_modificar = customtkinter.CTkButton(master=frame_tablero_arriba, width=120, command=self.modify_time, corner_radius=4, fg_color="darkorange", hover_color="darkorange4", text='Modificar') button_tiempo_modificar.grid(column=4, row=2, padx=20, pady=10) def start_countdown(self): if not self.running: self.running = True self.update_countdown() def pause_countdown(self): if self.running and self.after_id: self.tablero_principal.after_cancel(self.after_id) self.running = False def update_countdown(self): # 更新界面显示 self.text_minutos.set(f"{self.current_minutes:02d}") self.text_segundos.set(f"{self.current_seconds:02d}") # 倒计时结束判断 if self.current_minutes == 0 and self.current_seconds == 0: self.running = False return # 处理秒数递减,秒数为0时切换分钟 self.current_seconds -= 1 if self.current_seconds < 0: self.current_minutes -= 1 self.current_seconds = 59 # 循环触发倒计时 self.after_id = self.tablero_principal.after(1000, self.update_countdown) def modify_time(self): # 暂停时允许修改倒计时时间 def save_new_time(): try: new_min = int(entry_min.get()) new_sec = int(entry_sec.get()) if new_min >=0 and new_sec >=0 and new_sec <60: self.current_minutes = new_min self.current_seconds = new_sec self.text_minutos.set(f"{new_min:02d}") self.text_segundos.set(f"{new_sec:02d}") top.destroy() except ValueError: pass if not self.running: top = tk.Toplevel(self.tablero_principal) top.title("修改时间") tk.Label(top, text="分钟:").grid(row=0, column=0, padx=5, pady=5) entry_min = tk.Entry(top) entry_min.grid(row=0, column=1, padx=5, pady=5) entry_min.insert(0, self.current_minutes) tk.Label(top, text="秒数:").grid(row=1, column=0, padx=5, pady=5) entry_sec = tk.Entry(top) entry_sec.grid(row=1, column=1, padx=5, pady=5) entry_sec.insert(0, self.current_seconds) tk.Button(top, text="保存", command=save_new_time).grid(row=2, column=0, columnspan=2, pady=10) if __name__ == "__main__": root = customtkinter.CTk() app = Product(root) root.mainloop()
关键逻辑说明
分秒联动倒计时
- 用
current_minutes和current_seconds实例变量保存实时倒计时数值,避免仅依赖StringVar导致的逻辑脱节 - 在
update_countdown中优先处理秒数递减,当秒数小于0时,自动将分钟减1并重置秒数为59,直到分秒均为0时停止倒计时
- 用
暂停/继续功能
- 添加
running标记计时器运行状态,after_id保存after方法的返回ID,用于暂停时取消未执行的倒计时任务 - 点击「Iniciar」时,若计时器未运行则直接从当前分秒继续;点击「Detener」时,立即取消当前倒计时任务并标记为停止状态
- 添加
其他修复
- 补全了
frame_tablero_arriba的布局代码(原代码未布局导致控件不显示) - 将秒数标签绑定到
text_segundos变量,原代码为固定文本 - 实现了「Modificar」按钮的功能,支持在暂停状态下修改倒计时时间
- 补全了
内容的提问来源于stack exchange,提问作者arthur ramirez
相关产品推荐
相关产品推荐

