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

如何让CustomTkinter中Main_Canvas覆盖在Wel_img背景之上?

解决CustomTkinter中Canvas无法覆盖背景图的问题

问题原因

Tkinter(含CustomTkinter)组件的显示层级受布局顺序和组件层级控制影响。你当前的代码中,先对背景图Label执行pack(),再对Canvas执行pack(),但由于不同组件类型的层级优先级问题,导致Canvas被背景图遮挡。

解决方案

方案1:手动提升Canvas层级

在Canvas完成pack()后,调用lift()方法将其层级提升到背景图Label之上:

import customtkinter as ctk
from PIL import Image,ImageTk
import tkinter

def GoToAdkar():
    Main_Canvas.pack_forget()

window = ctk.CTk()
window.geometry("450x600")
Main_Frame = ctk.CTkFrame(window,width=450,height=600)
Main_Frame.pack()
Main_Canvas = ctk.CTkCanvas(Main_Frame, width=450, height=600,background="green",highlightthickness=0)
img= ImageTk.PhotoImage(Image.open("main.png"))

Wel_img = tkinter.Label(Main_Frame,image=img)
Wel_img.pack()

Main_Canvas.create_text(225,40,text="اذكار المسلم",font=("Arial",40),fill="#262626")
Main_Canvas.create_text(225,38,text="اذكار المسلم",font=("Arial",40),fill="grey")
Main_Canvas.create_text(225,36,text="اذكار المسلم",font=("Arial",40),fill="white")

Main_Canvas.create_line(70,75,400,75,width=4,fill="green")
Main_Canvas.create_line(90,85,380,85,width=4,fill="green")
Main_Canvas.pack()

# 新增:将Canvas提升到背景图Label之上
Main_Canvas.lift(Wel_img)

AdkarGoButton = ctk.CTkButton(Main_Canvas, text="بعض اذكار المسلم",corner_radius=0,
                            font=("Arial",30), width= 200,height=50,fg_color="#37692f"
                            ,hover_color="#264d20",command=GoToAdkar)
AdkarGoButton.place(x=125,y=130)

window.mainloop()

方案2:将背景图直接绘制到Canvas(更推荐)

放弃单独的Label承载背景图,直接在Canvas内部绘制背景图,所有交互元素都在同一个Canvas容器内,从根源避免层级冲突:

import customtkinter as ctk
from PIL import Image,ImageTk
import tkinter

def GoToAdkar():
    Main_Canvas.pack_forget()

window = ctk.CTk()
window.geometry("450x600")
Main_Frame = ctk.CTkFrame(window,width=450,height=600)
Main_Frame.pack()
Main_Canvas = ctk.CTkCanvas(Main_Frame, width=450, height=600,highlightthickness=0)

# 加载背景图并绘制到Canvas左上角
img= ImageTk.PhotoImage(Image.open("main.png"))
Main_Canvas.create_image(0, 0, image=img, anchor="nw")

# 绘制文本、线条等元素
Main_Canvas.create_text(225,40,text="اذكار المسلم",font=("Arial",40),fill="#262626")
Main_Canvas.create_text(225,38,text="اذكار المسلم",font=("Arial",40),fill="grey")
Main_Canvas.create_text(225,36,text="اذكار المسلم",font=("Arial",40),fill="white")

Main_Canvas.create_line(70,75,400,75,width=4,fill="green")
Main_Canvas.create_line(90,85,380,85,width=4,fill="green")
Main_Canvas.pack()

AdkarGoButton = ctk.CTkButton(Main_Canvas, text="بعض اذكار المسلم",corner_radius=0,
                            font=("Arial",30), width= 200,height=50,fg_color="#37692f"
                            ,hover_color="#264d20",command=GoToAdkar)
AdkarGoButton.place(x=125,y=130)

# 保留图像引用,防止被Python垃圾回收导致图片消失
window.img = img

window.mainloop()

注意:方案2中必须保留图像的引用(如window.img = img),否则PIL生成的PhotoImage对象会被Python垃圾回收机制回收,导致界面上背景图无法显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:05:15