无法同时启动主窗口与Toplevel窗口的倒计时问题求助
问题分析与解决方案
你的代码存在三个核心问题,导致Toplevel窗口的计时器无法启动:
- 启动逻辑缺失:
iniciar方法里没有将self.is_running设为True,这个变量是控制倒计时循环的关键,必须在启动时激活。 - 未更新Toplevel窗口的计时器:
countdown函数只处理了主窗口的text_minutos和text_segundos,完全没操作Toplevel窗口对应的计时器变量。 - 分钟倒计时逻辑错误:当前代码直接读取
text_minutos的当前值,但没有处理秒数归0时的分钟递减逻辑,主窗口的计时器也会在秒数到0后停止。
修正后的代码示例
import customtkinter as ctk class TimerApp: def __init__(self, window): self.is_running = False # 主窗口设置 self.tablero_principal = window self.tablero_principal.title('Tablero') # 主窗口计时器变量 self.text_minutos = ctk.StringVar(value="00") self.text_segundos = ctk.StringVar(value="60") # 主窗口控件(示例) ctk.CTkLabel(self.tablero_principal, textvariable=self.text_minutos).pack() ctk.CTkLabel(self.tablero_principal, text=":").pack(side="left") ctk.CTkLabel(self.tablero_principal, textvariable=self.text_segundos).pack(side="left") ctk.CTkButton(self.tablero_principal, text="Iniciar", command=self.iniciar).pack() ctk.CTkButton(self.tablero_principal, text="Parar", command=self.parar).pack() # Toplevel窗口设置 self.control_wind = ctk.CTkToplevel() self.control_wind.title('Posesion') # Toplevel窗口计时器变量 self.text_minutos_posesion = ctk.StringVar(value="00") self.text_segundos_posesion = ctk.StringVar(value="60") # Toplevel窗口控件(示例) ctk.CTkLabel(self.control_wind, textvariable=self.text_minutos_posesion).pack() ctk.CTkLabel(self.control_wind, text=":").pack(side="left") ctk.CTkLabel(self.control_wind, textvariable=self.text_segundos_posesion).pack(side="left") def countdown(self, seg_main, min_main, seg_pos, min_pos): if self.is_running: # 处理主窗口计时器逻辑 if seg_main < 0: min_main -= 1 seg_main = 59 # 更新主窗口显示 self.text_minutos.set(f"{min_main:02d}") self.text_segundos.set(f"{seg_main:02d}") # 处理Toplevel窗口计时器逻辑 if seg_pos < 0: min_pos -= 1 seg_pos = 59 # 更新Toplevel窗口显示 self.text_minutos_posesion.set(f"{min_pos:02d}") self.text_segundos_posesion.set(f"{seg_pos:02d}") # 两个计时器都没到0时继续递归 if (min_main > 0 or seg_main >= 0) and (min_pos > 0 or seg_pos >= 0): self.tablero_principal.after(1000, self.countdown, seg_main-1, min_main, seg_pos-1, min_pos) def iniciar(self): if not self.is_running: self.is_running = True # 读取当前两个计时器的初始值 init_seg_main = int(self.text_segundos.get()) init_min_main = int(self.text_minutos.get()) init_seg_pos = int(self.text_segundos_posesion.get()) init_min_pos = int(self.text_minutos_posesion.get()) self.countdown(init_seg_main, init_min_main, init_seg_pos, init_min_pos) def parar(self): self.is_running = False if __name__ == "__main__": root = ctk.CTk() app = TimerApp(root) root.mainloop()
关键修改说明
- 启动时激活状态:
iniciar方法里添加了self.is_running = True,确保倒计时循环能正常执行。 - 双计时器同步更新:
countdown函数接收主窗口和Toplevel窗口的秒数、分钟数参数,分别处理两个窗口的倒计时逻辑并更新对应的显示变量。 - 修复分钟递减逻辑:当秒数减到-1时,自动将分钟减1,秒数重置为59,保证计时器能正常从分到秒递减。
- 独立控制两个计时器:如果需要两个计时器时长不同,只需要修改初始值即可,当前代码支持同步递减不同时长的计时器。
内容的提问来源于stack exchange,提问作者arthur ramirez
相关产品推荐
相关产品推荐

