CustomTkinter中窗口图标与背景图设置报错求助
解决CTkCanvas中CTkImage报错及窗口图标、背景图显示问题
报错原因
你遇到的tkinter.TclError: image "..." doesn't exist错误,是因为tkinter原生Canvas的create_image方法不支持直接传入CustomTkinter的CTkImage对象——CTkImage是CustomTkinter对PIL图片的封装,底层需要提取其兼容tkinter的原生图像对象才能被Canvas识别。
修复方案及完整代码
下面是修复后的代码,同时优化了窗口图标、背景图的显示逻辑,也兼顾了顶层窗口的图标设置:
from tkinter import * import customtkinter as ctk from PIL import Image, ImageTk import sqlite3 # 连接数据库(原代码保留) conn = sqlite3.connect("userdata.db") # 主窗口初始化 Main_win = ctk.CTk() Main_win.title("SPDBM") # --- 窗口图标设置(兼容更多环境,同时支持顶层窗口复用)--- icon_img = ctk.CTkImage(Image.open("D:\\python programming\\image for background\\c.ico")) # 用wm_iconphoto设置图标,支持png/ico等格式,且顶层窗口可复用 Main_win.wm_iconphoto(True, icon_img.tk_image) # 设置外观模式和主题 ctk.set_appearance_mode("dark") ctk.set_default_color_theme("dark-blue") # 主框架 frame = ctk.CTkFrame(master=Main_win, width=400, height=400, corner_radius=30) frame.pack(fill="both", padx=10, pady=10, expand=True) # Canvas背景图设置 canvas = ctk.CTkCanvas(master=frame, bg="grey16", height=500, width=800, bd=0, highlightthickness=0) canvas.pack(fill="both", expand=True) # 加载背景图:关键是提取CTkImage的tk_image属性,同时保留CTkImage引用防止被回收 bg_image = ctk.CTkImage(Image.open("D:\\python programming\\image for background\\trees.png"), size=(800, 500)) # 用bg_image.tk_image传入create_image,同时要保持bg_image变量不被销毁 canvas.create_image(0, 0, anchor="nw", image=bg_image.tk_image) # --- 示例:创建顶层窗口并设置相同图标 --- def open_top_win(): top_win = ctk.CTkToplevel(Main_win) top_win.title("顶层窗口") # 复用主窗口的图标 top_win.wm_iconphoto(True, icon_img.tk_image) ctk.CTkLabel(top_win, text="测试顶层窗口").pack(padx=20, pady=20) # 可添加按钮测试顶层窗口 test_btn = ctk.CTkButton(frame, text="打开顶层窗口", command=open_top_win) test_btn.pack(pady=20) Main_win.mainloop()
关键修改点说明
- Canvas背景图修复:调用
CTkImage对象的.tk_image属性,获取其底层兼容tkinter的图像对象,传给canvas.create_image;同时要保留bg_image的引用(不能是临时变量),否则Python垃圾回收会销毁图像资源,导致图片显示消失。 - 窗口图标优化:改用
wm_iconphoto方法设置图标,相比iconbitmap兼容性更好(支持更多图像格式,在不同系统下更稳定),且顶层窗口可以直接复用同一个图标对象。 - 顶层窗口图标:创建
CTkToplevel时,同样用wm_iconphoto传入复用的图标对象即可实现统一图标。
内容的提问来源于stack exchange,提问作者ኢትዮጵ ኑብ
相关产品推荐
相关产品推荐

