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

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,提问作者ኢትዮጵ ኑብ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:59:59