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

如何解决Python中Customtkinter按钮添加图片的报错问题?

Customtkinter按钮添加图片报错解决方法

我尝试为Customtkinter按钮添加图片,但运行代码时出现错误。我的代码如下:

import sqlite3
from tkinter import *
import customtkinter
from tkinter import ttk
from PIL import Image, ImageTk

customtkinter.set_appearance_mode('dark')
customtkinter.set_default_color_theme('blue')

#Create a Ctk instance(app)
main = customtkinter.CTk()
main.geometry("400x240")
main.resizable(width=False, height=False)

#Username Frame
username_tittle = customtkinter.CTkLabel(master=main, text='Username:').place(relx=0.2, rely= 0.3)
username_box = customtkinter.CTkEntry(master=main, width=150)
username_box.place(relx=0.43, rely=0.3)
python_image = ImageTk.PhotoImage(Image.open('user_icon.png'), Image.ANTIALIAS, )
but = customtkinter.CTkButton(master=main, image=python_image).pack()

运行后出现以下错误信息:

c:\Users\claud\OneDrive\Documentos\meuusprojetos\Login\main.py:19: DeprecationWarning: ANTIALIAS is deprecated and will be removed in Pillow 10 (2023-07-01). Use LANCZOS or Resampling.LANCZOS instead.
python_image = ImageTk.PhotoImage(Image.open('user_icon.png'), Image.ANTIALIAS, )
CTkButton Warning: Given image is not CTkImage but <class 'PIL.ImageTk.PhotoImage'>. Image can not be scaled on HighDPI displays, use CTkImage instead.
Traceback (most recent call last):
File "c:\Users\claud\OneDrive\Documentos\meuusprojetos\Login\main.py", line 20, in <module>
but = customtkinter.CTkButton(master=main, image=python_image).pack()
File "C:\Users\claud\AppData\Local\Programs\Python\Python310\lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 106, in __init__
self._draw()
File "C:\Users\claud\AppData\Local\Programs\Python\Python310\lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 243, in _draw
self._update_image()  # set image
File "C:\Users\claud\AppData\Local\Programs\Python\Python310\lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 154, in _update_image
self._image_label.configure(image=self._image.create_scaled_photo_image(self._get_widget_scaling(),
AttributeError: 'PhotoImage' object has no attribute 'create_scaled_photo_image'

问题原因及解决步骤

  • 核心错误:Customtkinter的CTkButton仅支持自身的CTkImage类型,不兼容PIL.ImageTk.PhotoImage,这是导致AttributeError的直接原因。
  • 次要警告:Pillow的ANTIALIAS已被弃用,需替换为LANCZOS。

修改后的完整代码

import sqlite3
from tkinter import *
import customtkinter
from tkinter import ttk
from PIL import Image, ImageTk

customtkinter.set_appearance_mode('dark')
customtkinter.set_default_color_theme('blue')

#Create a Ctk instance(app)
main = customtkinter.CTk()
main.geometry("400x240")
main.resizable(width=False, height=False)

#Username Frame
username_tittle = customtkinter.CTkLabel(master=main, text='Username:').place(relx=0.2, rely= 0.3)
username_box = customtkinter.CTkEntry(master=main, width=150)
username_box.place(relx=0.43, rely=0.3)

# 使用Customtkinter的CTkImage加载图片,同时修复弃用警告
python_image = customtkinter.CTkImage(light_image=Image.open('user_icon.png'),
                                      dark_image=Image.open('user_icon.png'),
                                      size=(20, 20))  # 可自定义图片尺寸
but = customtkinter.CTkButton(master=main, image=python_image, text="")  # 若不需要文字可设为空
but.pack()

main.mainloop()

关键修改说明

  1. 替换图片加载方式:用customtkinter.CTkImage替代ImageTk.PhotoImage,该类专为Customtkinter组件设计,支持高DPI屏幕的图片缩放,避免报错。
  2. 修复Pillow弃用警告:移除Image.ANTIALIAS参数,CTkImage内部已处理图片采样,若需手动指定可在Image.open后添加resize方法并使用Image.Resampling.LANCZOS。
  3. 分离组件创建与布局:将but = ...pack()拆分为两行,避免按钮对象被赋值为None(pack()返回None),方便后续对按钮进行操作。

内容的提问来源于stack exchange,提问作者Cláudio Aguiar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:10:39