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

无法同时启动主窗口与Toplevel窗口的倒计时问题求助

问题分析与解决方案

你的代码存在三个核心问题,导致Toplevel窗口的计时器无法启动:

  1. 启动逻辑缺失:iniciar方法里没有将self.is_running设为True,这个变量是控制倒计时循环的关键,必须在启动时激活。
  2. 未更新Toplevel窗口的计时器:countdown函数只处理了主窗口的text_minutos和text_segundos,完全没操作Toplevel窗口对应的计时器变量。
  3. 分钟倒计时逻辑错误:当前代码直接读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:25:46