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
相关产品推荐
相关产品推荐

