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

CTkToplevel调用lift()后置随即退回,如何不禁用主窗口保持前置?

解决CTkToplevel调用lift()后立刻退回主窗口后方的问题

问题原因

CustomTkinter的CTkToplevel在初始化过程中,内部逻辑可能会让主窗口重新获取焦点,导致你调用lift()后子窗口立刻被主窗口覆盖。原生tkinter没有这个额外的焦点处理逻辑,所以不会出现该问题。

解决方案

可以通过强制子窗口获取焦点后再执行前置,或者延迟执行lift()操作来避开CustomTkinter的内部焦点重置逻辑,同时满足主窗口保持可用、主窗口获焦时子窗口自动退回后方的需求。

方法1:强制聚焦+前置

import customtkinter as ctk

ctk.set_appearance_mode("light")
ctk.set_default_color_theme("blue")

root = ctk.CTk()
root.title("主窗口")
root.geometry("400x300")

def open_toplevel():
    top = ctk.CTkToplevel(root)
    top.title("子窗口")
    top.geometry("300x200")
    
    # 强制子窗口获取焦点,再执行前置
    top.focus_force()
    top.lift()

btn = ctk.CTkButton(root, text="打开子窗口", command=open_toplevel)
btn.pack(pady=20)

root.mainloop()

方法2:延迟执行lift()

如果方法1无效,可以尝试延迟执行lift(),等CustomTkinter的窗口初始化逻辑完成后再操作:

def open_toplevel():
    top = ctk.CTkToplevel(root)
    top.title("子窗口")
    top.geometry("300x200")
    
    # 延迟50ms执行前置,避开内部焦点处理
    top.after(50, top.lift)

说明

  • 这两种方法都不需要禁用主窗口,也不需要设置-topmost属性(topmost会让窗口始终置顶,不符合你需要的主窗口获焦时子窗口退回的需求)。
  • 当你点击主窗口时,子窗口会自动退到主窗口后方,完全符合你的使用场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:29:55