如何解决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()
关键修改说明
- 替换图片加载方式:用
customtkinter.CTkImage替代ImageTk.PhotoImage,该类专为Customtkinter组件设计,支持高DPI屏幕的图片缩放,避免报错。 - 修复Pillow弃用警告:移除
Image.ANTIALIAS参数,CTkImage内部已处理图片采样,若需手动指定可在Image.open后添加resize方法并使用Image.Resampling.LANCZOS。 - 分离组件创建与布局:将
but = ...pack()拆分为两行,避免按钮对象被赋值为None(pack()返回None),方便后续对按钮进行操作。
内容的提问来源于stack exchange,提问作者Cláudio Aguiar
相关产品推荐
相关产品推荐

