CustomTkinter使用overrideredirect(True)后任务栏不显示且窗口丢失的问题
CustomTkinter使用overrideredirect(True)后任务栏不显示且窗口丢失的问题
我之前也踩过这个坑!当你给窗口设置overrideredirect(True)时,Windows会把这个窗口判定为无框架的浮动窗口,不会将它纳入系统的任务栏和Alt+Tab窗口管理体系里,这就是为什么窗口会消失且无法找回的原因。你之前尝试的“虚拟窗口”思路是对的,但没把自定义窗口和虚拟主窗口关联起来,所以没效果。
下面是修复后的完整代码,我会一步步解释关键改动:
from customtkinter import * # 1. 创建主窗口作为任务栏的"载体",初始隐藏 root = CTk() root.withdraw() # 先隐藏主窗口 root.title("WHC Launcher | Sign In") root.iconbitmap("WHC.ico") # 2. 创建自定义窗口,作为主窗口的Toplevel子窗口 app = CTkToplevel(root) app.geometry("350x500") app.overrideredirect(True) # 关键:将自定义窗口和主窗口关联,让系统把它们视为一组 app.transient(root) # 允许窗口被其他窗口覆盖(如果需要始终置顶可以设为True) app.wm_attributes("-topmost", False) # 3. 重写最小化逻辑:隐藏自定义窗口,保留主窗口在任务栏 def minimize_app(): app.withdraw() # 触发主窗口的显示再隐藏,这样点击任务栏图标就能唤起自定义窗口 root.deiconify() root.withdraw() minimize_button = CTkButton(app, text="─", font=("Arial", 20), width=30, height=30, corner_radius=0, fg_color="transparent", hover_color="#333333", command=minimize_app) minimize_button.place(x=270, y=10) # 4. 重写关闭逻辑:同时销毁自定义窗口和主窗口 def close_app(): app.destroy() root.destroy() close_button = CTkButton(app, text="✕", font=("Arial", 18), width=30, height=30, corner_radius=0, fg_color="transparent", hover_color="#FF0000", command=close_app) close_button.place(x=305, y=10) # 5. 绑定主窗口事件:当点击任务栏图标时,恢复自定义窗口 def on_taskbar_click(event): app.deiconify() root.withdraw() root.bind("<Map>", on_taskbar_click) app.mainloop()
关键改动说明:
- 主窗口root:作为系统任务栏识别的“实体”,它的图标和标题会显示在任务栏,即使它本身是隐藏的
- CTkToplevel关联:把自定义窗口设为主窗口的子窗口,并用
transient(root)让系统将两者绑定,这样Alt+Tab就能找到它们 - 任务栏唤起逻辑:绑定主窗口的
<Map>事件(当任务栏图标被点击时触发),自动恢复自定义窗口并隐藏主窗口 - 最小化/关闭逻辑:确保操作同时关联主窗口和自定义窗口,避免窗口残留或无法唤起
这样修改后,你的自定义窗口就能正常显示在任务栏,点击外面消失后也能通过任务栏或Alt+Tab找回了。
备注:内容来源于stack exchange,提问作者Maddox
相关产品推荐
相关产品推荐

