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

